Як отримати перше слово речення в 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]
Еллі Повідомлення

2
1 код рядка для будь-якої версії PHP:list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys

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

Що робити, якщо ви хочете друге слово, а також від RSS NewYorkTimes - медіа: кредит є - <медіа: кредит> Дмитро Костюков для The New York Times </ media: Credit>. Я хочу лише Дмитра Костюкова - як це зробити? =)

282

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

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

Детальніше та приклади див . На сторінці керівництва PHP strtok .


3
Бриліант! Краще, ніж оригінальне рішення
Альберто Фонтана

Це має бути перша відповідь. Це лише повертає перше слово так, як він хотів чистіше.
Уес

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

1
Я щодня користуюся PHP протягом принаймні 6 років, і я до цього часу не чув про цю функцію
Epoc

2
strtokце дивна і небезпечна функція, яка виконує глобальну державу. Використовувати цю функцію слід не рекомендувати.
Арнольд Даніельс

39

Якщо у вас 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, на який є дуже багато відповідей, використовуючи його, я не буду вказувати, як це зробити.


1
+1 за те, що не використовується вибух або регекс (обидва недоречні імхо). Іншою альтернативою може бути використання strstr з str_replace, замінивши частину після голки strstr нічим.
Гордон

1
Варто зазначити, що хоча strstrце доступно в PHP, оскільки 4.3.0його не було раніше 5.3.0, коли before_needleбув доданий необов'язковий параметр (який ви використовуєте в цьому прикладі). Просто зауваження, тому що я був розгублений, чому ви заявляєте, що цей приклад потрібен 5.3.0.
trejder

Зауважте, що якщо ви встановите 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

За допомогою функції розділення також можна отримати перше слово з рядка.

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

5
ПРИМІТКА - split () ВИМОГАЄТЬСЯ з 5.3>
Лев



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

Ви можете зробити це за допомогою substr рядка функції PHP, не передаючи рядок у масив.

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

// вихід S


Прекрасне рішення отримати перший лист запиту MySQL для розпізнавання операцій запиту, таких як Select, Insert or 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>';

?>

Ось різні результати за два послідовні запуски:

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.