Я хочу извлечь первое слово переменной из строки. Например, возьмите этот ввод:
<?php $myvalue = 'Test me more'; ?>
Результирующий вывод должен быть Test
, который является первым словом ввода. Как я могу это сделать?
Я хочу извлечь первое слово переменной из строки. Например, возьмите этот ввод:
<?php $myvalue = 'Test me more'; ?>
Результирующий вывод должен быть Test
, который является первым словом ввода. Как я могу это сделать?
Вы можете использовать функцию разнесения следующим образом:
$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
explode(' ',trim($myvalue))[0]
- person Elly Post; 01.04.2016
list($firstword) = explode(' ', trim($myvalue), 1);
- person Cédric Françoys; 27.10.2016
limit
должен быть 2, так как он должен включать последний элемент, содержащий остальную часть строки; 1 просто вернет ту же самую строку. Если не будет создан большой массив, я бы выбрал версию Elliot для одного лайнера.
- person Sdlion; 28.02.2017
explode(" ",strip_tags("<media:credit>Dmitry Kostyukov for The New York Times</media:credit>"))[0]
- person pbarney; 06.09.2017
"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.
strtok
- странная и опасная функция, хранящая глобальное состояние. Не рекомендуется использовать эту функцию.
- person Arnold Daniels; 20.08.2018
Если у вас 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, на который есть так много ответов, что я не буду беспокоиться о том, как это сделать.
strstr
доступен в PHP с 4.3.0
, этого не было до 5.3.0
, когда был добавлен необязательный параметр before_needle
(который вы используете в этом примере). Просто обратите внимание, потому что я был сбит с толку, почему вы утверждаете, что для этого примера требуется 5.3.0
.
- person trejder; 07.05.2013
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
- person billynoah; 13.06.2018
Ты мог бы сделать
echo current(explode(' ',$myvalue));
Хотя уже немного поздно, но у PHP есть одно лучшее решение для этого:
$words=str_word_count($myvalue, 1);
echo $words[0];
Аналогично принятому ответу с одним шагом меньше:
$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];
//$first_word == 'Test'
На всякий случай, если вы не уверены, что строка начинается со слова ...
$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
trim($input)
в этом случае будет достаточно: P
- person zanderwar; 25.06.2015
Используя функцию разделения, вы также можете получить первое слово из строки.
<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
$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;
С уважением, Чул
<?php
$value = "Hello world";
$tokens = explode(" ", $value);
echo $tokens[0];
?>
Просто используйте разнесение, чтобы получить каждое слово ввода и вывести первый элемент результирующего массива.
лично strsplit
/ explode
/ strtok
не поддерживает границы слов, поэтому для более точного разделения используйте регулярное выражение с \w
preg_split('/[\s]+/',$string,1);
Это приведет к разделению слов с границами до 1.
Вы можете сделать это с помощью строковой функции PHP substr без преобразования строки в массив.
$string = 'some text here';
$stringLength= strlen($string);
echo ucfirst(substr($string,-$stringLength-1, 1));
// вывод S
Если вы хотите узнать, насколько быстро работает каждая из этих соответствующих функций, я провел в 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
Заключение. Оказалось, что скорость работы этих функций сильно различается и не так согласована между запусками тестов, как можно было бы ожидать. Согласно этим быстрым и грязным тестам, любая из шести выбранных функций выполнит свою работу в разумные сроки. Есть возмущения, в том числе другие запущенные процессы, которые влияют на время выполнения. Так что просто используйте любую функцию, которая наиболее практична и удобочитаема для вас как программиста. Для более полной картины программирования см. Грамотное программирование em Дональда Кнута. >.
Функция, которая разбивает строку на две части: первое слово и оставшуюся строку.
Возвращаемое значение: он будет иметь ключи 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;
}
$ first_word = str_word_count (1) [0]
Не работает со специальными символами и приведет к неправильному поведению при использовании специальных символов. Он не поддерживает UTF-8.
Для получения дополнительной информации проверьте безопасен ли многобайтовый PHP str_word_count ()?
Поскольку вы не можете проверить с помощью stroke для верхнего или нижнего регистра, это отлично работает для проверки первого слова.
if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }
Ваш вопрос можно переформулировать как «заменить в строке первый пробел и все последующее ничем». Этого можно добиться с помощью простого регулярного выражения:
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
Для безопасности я добавил необязательный вызов ltrim (): эта функция удаляет пробелы в начале строки.
Во всех ответах здесь используется подход, при котором процессору необходимо выполнять поиск по всей строке, даже если найдено первое слово! Для больших струн это не рекомендуется. Этот подход оптимален:
function getFirstWord($string) {
$result = "";
foreach($string as $char) {
if($char == " " && strlen($result)) {
break;
}
$result .= $char;
}
return $result;
}
s($str)->words()[0]
полезным как можно найти в этой автономной библиотеке. - person caw   schedule 27.07.2016