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


156

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

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

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


Вы могли бы найти s($str)->words()[0]полезным, как найти в этой автономной библиотеке .
кар

Ответы:


254

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

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test

Давайте сделаем это 100, это поможет мне :)
Шивам Пандя

41
Используя современный синтаксис PHP, вы можете просто сделать этоexplode(' ',trim($myvalue))[0]
Elly Post

2
1-строчный код для любой версии PHP:list($firstword) = explode(' ', trim($myvalue), 1);
Седрик Франсуа

3
@ CédricFrançoys limitпараметр должен быть равен 2, поскольку он должен включать последний элемент, содержащий остальную часть строки; Я бы просто вернул ту же самую строку. Если не будет создан большой массив, я бы выбрал версию Elliot для одного лайнера.
Сдлион

Что делать, если вы хотите второе слово, а также из RSS NewYorkTimes - media: credit is - <media: credit> Дмитрий Костюков для The New York Times </ media: credit>. Я хочу только Дмитрия Костюкова - как мне это сделать? =)

282

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

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

Для получения более подробной информации и примеров, смотрите страницу руководства по strtok PHP .


3
Briliiant! Лучше, чем оригинальное решение
Альберто Фонтана

Это должен быть первый ответ. Он возвращает только первое слово, как он хотел, более чистым способом.
Уэс

2
Хорошее решение, но в руководстве по php он предупреждает: эта функция может возвращать логическое значение FALSE, но может также возвращать и не булево значение, которое оценивается как FALSE.
Джей Харрис

1
Я использую PHP ежедневно в течение по крайней мере 6 лет, и я никогда не слышал об этой функции до сих пор
Epoc

2
strtokэто странная и опасная функция, которая содержит глобальное состояние. Использование этой функции не рекомендуется.
Арнольд Дэниелс

39

Если у вас есть PHP 5.3

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

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

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

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

Альтернатива что-то вроде:

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

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


1
+1 за не использование взрыва или регулярного выражения (оба неуместны imho). Другая альтернатива - использовать strstr с str_replace, заменяя деталь после иглы из strstr ничем.
Гордон

1
Стоит отметить, что хотя strstrон доступен в PHP, так как 4.3.0его не было раньше 5.3.0, когда before_needleбыл добавлен необязательный параметр (который вы используете в этом примере). Просто замечание, потому что я запутался, зачем вы заявляете, что этот пример нужен 5.3.0.
Трейдер

Обратите внимание, что если вы установите myvalue для одного слова, strstr ничего не возвращает в этом случае! Решением может быть добавление пробела в конце проверяемой строки, чтобы оно всегда возвращалось с первым словом, даже если это единственное слово в строке!
Патрик

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

не должно бытьecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah



7

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

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

//$first_word == 'Test'

5

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

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test

trim($input)было бы достаточно в этом случае: P
zanderwar

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

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


4

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

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>

5
ПРИМЕЧАНИЕ - split () УСТАРЕЛО с 5.3>
Лев


2
$ input = "Проверь меня больше";
echo preg_replace ("/ \ s. * $ /", "", $ input); // "Тест"

2

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

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

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


RobertPitt -> Было бы полезно, если бы вы привели пример, где strtok потерпел неудачу с границей слова по сравнению с preg_split.
MarcoZen

1
$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;

С уважением, Ciul


Это был бы лучший ответ, так как он также работает для «один, два и три» (принятый ответ будет повторять «один»)
Патрик

1
public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}

1

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

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

// вывод S


Отличное решение для получения первой буквы запроса MySQL для распознавания операции запроса, такой как Select, Insert или Update
Intacto

0
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];

0

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

Возвращаемое значение: будет иметь 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;
}

0

$ first_word = str_word_count (1) [0]

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

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


0

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

if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }

0

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

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

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


0

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

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

0

Если вы хотите знать , как быстро каждый из этих соответствующих функций, я побежал некоторые сырой бенчмаркинга в 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>';

?>

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.