Как получить первое слово предложения в PHP?

Я хочу извлечь первое слово переменной из строки. Например, возьмите этот ввод:

<?php $myvalue = 'Test me more'; ?>

Результирующий вывод должен быть Test, который является первым словом ввода. Как я могу это сделать?


person ali    schedule 19.03.2010    source источник
comment
Вы можете найти s($str)->words()[0] полезным как можно найти в этой автономной библиотеке.   -  person caw    schedule 27.07.2016


Ответы (19)


Вы можете использовать функцию разнесения следующим образом:

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
person codaddict    schedule 19.03.2010
comment
Давай сделаем 100, помоги мне :) - person Shivam Pandya; 22.02.2016
comment
Используя современный синтаксис PHP, вы можете просто explode(' ',trim($myvalue))[0] - person Elly Post; 01.04.2016
comment
Однострочный код для любой версии PHP: list($firstword) = explode(' ', trim($myvalue), 1); - person Cédric Françoys; 27.10.2016
comment
@ CédricFrançoys параметр limit должен быть 2, так как он должен включать последний элемент, содержащий остальную часть строки; 1 просто вернет ту же самую строку. Если не будет создан большой массив, я бы выбрал версию Elliot для одного лайнера. - person Sdlion; 28.02.2017
comment
Что делать, если вам нужно второе слово, а также из RSS NewYorkTimes - СМИ: кредит - ‹СМИ: кредит› Дмитрий Костюков для The New York Times ‹/ media: кредит›. Мне нужен только Дмитрий Костюков - Как мне это сделать? знак равно - person ; 17.04.2017
comment
@xxxx, сделай explode(" ",strip_tags("<media:credit>Dmitry Kostyukov for The New York Times</media:credit>"))[0] - person pbarney; 06.09.2017
comment
@ j4k3 Пожалуйста, не забудьте быть вежливым. - person Filnor; 05.03.2018
comment
Если вы ищете самый неэффективный способ получить первое слово в строке, это хорошее решение. Во всех остальных случаях вам лучше здесь дать буквально любой другой ответ. Как это получить положительные голоса? - person j4k3; 05.03.2018
comment
Это не лучший ответ! Он повторяет один, если строка один, два три. Лучший ответ ниже, @Ciul - person patrick; 17.08.2018
comment
Не работает. попробуйте это с помощью этой строки: \ n \ nNextWord. В этом ответе предполагается, что все слова разделены только пробелами. - person Dev Null; 17.01.2021
comment
Слова заканчиваются не первым пробелом, а первым символом, это не буква. Например, "Hey, how are you? (возвращает Hey,) или Stop! Now (возвращает Stop!) - person Philipp; 02.04.2021

Существует строковая функция (strtok), которую можно использовать для разделения строки на более мелкие строки (токены < / em>) на основе некоторого разделителя (ов). Для целей этого потока первое слово (определенное как любое слово перед первым символом пробела) Test me more может быть получено путем токенизации строки на символе пробела.

<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>

Дополнительные сведения и примеры см. На странице strtok PHP.

person salathe    schedule 19.03.2010
comment
Бриллиант! Лучше оригинального решения - person Alberto Fontana; 13.02.2015
comment
Это должен быть первый ответ. Он возвращает только первое слово, как он хотел, в более чистой форме. - person Wes; 23.10.2017
comment
Хорошее решение, но в руководстве по php оно предупреждает: эта функция может возвращать логическое значение FALSE, но также может возвращать не-логическое значение, которое оценивается как FALSE. - person Jay Harris; 26.11.2017
comment
Я использую PHP ежедневно как минимум 6 лет, и до сих пор не слышал об этой функции. - person Epoc; 07.12.2017
comment
strtok - странная и опасная функция, хранящая глобальное состояние. Не рекомендуется использовать эту функцию. - person Arnold Daniels; 20.08.2018
comment
Не работает. попробуйте это с помощью этой строки: \ n \ nNextWord. В этом ответе предполагается, что все слова разделены только пробелами. - person Dev Null; 17.01.2021

Если у вас PHP 5.3

$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);

обратите внимание, что если $myvalue - это строка с одним словом, strstr в этом случае ничего не возвращает. Решением может быть добавление пробела к тестовой строке:

echo strstr( $myvalue . ' ', ' ', true );

Это всегда будет возвращать первое слово строки, даже если в строке есть только одно слово.

Альтернатива примерно такая:

$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );

Или с помощью explode, на который есть так много ответов, что я не буду беспокоиться о том, как это сделать.

person Yacoby    schedule 19.03.2010
comment
+1 за то, что не использовал разнесение или регулярное выражение (оба неподходящие, имхо). Другой альтернативой было бы использовать strstr с str_replace, заменяя часть после иглы из strstr ничем. - person Gordon; 19.03.2010
comment
Стоит отметить, что, хотя strstr доступен в PHP с 4.3.0, этого не было до 5.3.0, когда был добавлен необязательный параметр before_needle (который вы используете в этом примере). Просто обратите внимание, потому что я был сбит с толку, почему вы утверждаете, что для этого примера требуется 5.3.0. - person trejder; 07.05.2013
comment
Обратите внимание: если вы установите myvalue в одно слово, strstr в этом случае ничего не вернет! Решением может быть всегда добавление пробела в конце проверенной строки, чтобы оно всегда возвращалось с первым словом, даже если это единственное слово в строке! - person patrick; 07.12.2015
comment
Предполагая, что только пробелы между словами опасны, я бы также включил вкладки. - person ; 06.01.2016
comment
не должно быть echo $i === false ? $myvalue : substr( $myvalue, 0, $i ); - person billynoah; 13.06.2018
comment
Не работает. попробуйте это с помощью этой строки: \ n \ nNextWord. В этом ответе предполагается, что все слова разделены только пробелами. - person Dev Null; 17.01.2021

Ты мог бы сделать

echo current(explode(' ',$myvalue));
person AntonioCS    schedule 19.03.2010
comment
Не работает. попробуйте это с помощью этой строки: \ n \ nNextWord. В этом ответе предполагается, что все слова разделены только пробелами. - person Dev Null; 17.01.2021

Хотя уже немного поздно, но у PHP есть одно лучшее решение для этого:

$words=str_word_count($myvalue, 1);
echo $words[0];
person Lakshmi Rawat Singhania    schedule 21.08.2014

Аналогично принятому ответу с одним шагом меньше:

$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];

//$first_word == 'Test'
person wheelmaker    schedule 26.07.2017
comment
Не работает. попробуйте это с помощью этой строки: \ n \ nNextWord. В этом ответе предполагается, что все слова разделены только пробелами. - person Dev Null; 17.01.2021
comment
да, это предполагает, что предложение состоит из слов, разделенных пробелами - person wheelmaker; 17.01.2021
comment
Я думаю, вы упустили суть. Я ввел букву W в верхний регистр, чтобы вам было легче читать. Возможно, это будет иметь для вас больше смысла - \ n \ nЭто не сработает. Приведенный выше код будет думать, что первое слово \ n \ nЭто - person Dev Null; 14.03.2021

На всякий случай, если вы не уверены, что строка начинается со слова ...

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
person Lupuz    schedule 17.09.2012
comment
trim($input) в этом случае будет достаточно: P - person zanderwar; 25.06.2015

Используя функцию разделения, вы также можете получить первое слово из строки.

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
person rekha_sri    schedule 20.03.2010
comment
ПРИМЕЧАНИЕ. Split () УСТАРЕЛ с версии 5.3 › - person Leo; 03.06.2011

$string = ' Test me more ';
preg_match('/\b\w+\b/i', $string, $result); // Test
echo $result;

/* You could use [a-zA-Z]+ instead of \w+ if wanted only alphabetical chars. */
$string = ' Test me more ';
preg_match('/\b[a-zA-Z]+\b/i', $string, $result); // Test
echo $result;

С уважением, Чул

person Ciul    schedule 09.04.2013
comment
Это был бы лучший ответ, так как он также работает для одного, двух и трех (принятый ответ будет повторять один,) - person patrick; 17.08.2018

<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

Просто используйте разнесение, чтобы получить каждое слово ввода и вывести первый элемент результирующего массива.

person Ulf    schedule 19.03.2010
comment
Не работает. попробуйте это с помощью этой строки: \ n \ nNextWord. В этом ответе предполагается, что все слова разделены только пробелами. - person Dev Null; 17.01.2021

strtok быстрее, чем extract или _ 3_.

person HM2K    schedule 21.01.2011

лично strsplit / explode / strtok не поддерживает границы слов, поэтому для более точного разделения используйте регулярное выражение с \w

preg_split('/[\s]+/',$string,1);

Это приведет к разделению слов с границами до 1.

person RobertPitt    schedule 13.09.2010
comment
РобертПитт - ›Было бы полезно, если бы вы привели пример, в котором strtok завершился ошибкой с границей слова по сравнению с preg_split. - person MarcoZen; 09.04.2018

Вы можете сделать это с помощью строковой функции PHP substr без преобразования строки в массив.

 $string = 'some text here';
 $stringLength= strlen($string);
 echo ucfirst(substr($string,-$stringLength-1, 1));

// вывод S

person Afraz Ahmad    schedule 28.06.2018
comment
Отличное решение для получения первой буквы запроса MySQL для распознавания операции запроса, такой как Select, Insert или Update. - person Intacto; 28.05.2019

Если вы хотите узнать, насколько быстро работает каждая из этих соответствующих функций, я провел в PHP 7.3 грубый сравнительный анализ шести ответов, получивших наибольшее количество голосов (strpos с substr, explode с current, strstr, explode с trim, str_word_count и strtok) с 1 000 000 итераций для сравнения их скоростей.

<?php

$strTest = 'This is a string to test fetching first word of a string methods.';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    $p = strpos($strTest, ' ');
    $p !== false ? $strTest : substr( $strTest, 0, $p );
}
$after = microtime(true);
echo 'strpos/ substr: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    strstr($strTest, ' ', true);
}
$after = microtime(true);
echo 'strstr: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    current(explode(' ',$strTest));
}
$after = microtime(true);
echo 'explode/ current: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    $arr = explode(' ',trim($strTest));
    $arr[0];
}
$after = microtime(true);
echo 'explode/ trim: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    str_word_count($strTest, 1);
}
$after = microtime(true);
echo 'str_word_count: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    strtok($value, ' ');
}
$after = microtime(true);
echo 'strtok: '.($after-$before)/$i . ' seconds<br>';

?>

Вот разные результаты двух последовательных прогонов:

strpos/ substr: 6.0736894607544E-8 seconds
strstr: 5.0434112548828E-8 seconds
explode/ current: 3.5163116455078E-7 seconds
explode/ trim: 3.8683795928955E-7 seconds
str_word_count: 4.6665270328522E-6 seconds
strtok: 4.9849510192871E-7 seconds

strpos/ substr: 5.7171106338501E-8 seconds
strstr: 4.7624826431274E-8 seconds
explode/ current: 3.3753299713135E-7 seconds
explode/ trim: 4.2293286323547E-7 seconds
str_word_count: 3.7025549411774E-6 seconds
strtok: 1.2249300479889E-6 seconds

И результаты после инвертирования порядка функций:

strtok: 4.2612719535828E-7 seconds
str_word_count: 4.1899878978729E-6 seconds
explode/ trim: 9.3175292015076E-7 seconds
explode/ current: 7.0811605453491E-7 seconds
strstr: 1.0137891769409E-7 seconds
strpos/ substr: 1.0082197189331E-7 seconds

Заключение. Оказалось, что скорость работы этих функций сильно различается и не так согласована между запусками тестов, как можно было бы ожидать. Согласно этим быстрым и грязным тестам, любая из шести выбранных функций выполнит свою работу в разумные сроки. Есть возмущения, в том числе другие запущенные процессы, которые влияют на время выполнения. Так что просто используйте любую функцию, которая наиболее практична и удобочитаема для вас как программиста. Для более полной картины программирования см. Грамотное программирование .

person Improv    schedule 14.04.2020

Функция, которая разбивает строку на две части: первое слово и оставшуюся строку.

Возвращаемое значение: он будет иметь ключи first и remaining в $return массиве соответственно. первая проверка strpos( $title," ") !== false является обязательной, если в строке всего одно слово и нет пробела.

function getStringFirstWord( $title ){

    $return = [];

    if( strpos( $title," ") !== false ) {

        $firstWord = strstr($title," ",true);
        $remainingTitle = substr(strstr($title," "), 1);

        if( !empty( $firstWord ) ) {
            $return['first'] = $firstWord;
        }
        if( !empty( $remainingTitle ) ) {
            $return['remaining'] = $remainingTitle;
        }
    }
    else {
        $return['first'] = $title;
    }

    return $return;
}
person Shahzaib Hayat Khan    schedule 25.04.2018

$ first_word = str_word_count (1) [0]

Не работает со специальными символами и приведет к неправильному поведению при использовании специальных символов. Он не поддерживает UTF-8.

Для получения дополнительной информации проверьте безопасен ли многобайтовый PHP str_word_count ()?

person Anders Lund    schedule 04.12.2019

Поскольку вы не можете проверить с помощью stroke для верхнего или нижнего регистра, это отлично работает для проверки первого слова.

if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }
person Baz    schedule 18.12.2019

Ваш вопрос можно переформулировать как «заменить в строке первый пробел и все последующее ничем». Этого можно добиться с помощью простого регулярного выражения:

$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));

Для безопасности я добавил необязательный вызов ltrim (): эта функция удаляет пробелы в начале строки.

person Clément Moulin - SimpleRezo    schedule 24.01.2020

Во всех ответах здесь используется подход, при котором процессору необходимо выполнять поиск по всей строке, даже если найдено первое слово! Для больших струн это не рекомендуется. Этот подход оптимален:

function getFirstWord($string) {
    $result = "";
    foreach($string as $char) {
        if($char == " " && strlen($result)) {
            break;
        }
        $result .= $char;
    }
    return $result;
}
person Amir Fo    schedule 07.04.2020