Відповіді:
Ви можете використовувати функцію вибуху наступним чином:
$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
explode(' ',trim($myvalue))[0]
list($firstword) = explode(' ', trim($myvalue), 1);
limit
параметру повинно бути 2, оскільки він повинен включати останній елемент, що містить решту рядка; Я б тільки повернув ту саму строку. Якщо не буде створено великий масив, я б пішов з версією Elliot на один лайнер.
Існує рядкова функція ( strtok ), яку можна використовувати для розділення рядка на менші рядки ( лексеми ) на основі деяких роздільників. Для цілей цього потоку, перше слово (визначене як що-небудь перед першим символом пробілу) Test me more
може бути отримане за допомогою токенізації рядка на пробільний символ.
<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>
Детальніше та приклади див . На сторінці керівництва PHP strtok .
strtok
це дивна і небезпечна функція, яка виконує глобальну державу. Використовувати цю функцію слід не рекомендувати.
Якщо у вас 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
.
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
Незважаючи на те, що це вже трохи пізно, але 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'
особисто strsplit
/ explode
/ strtok
не підтримує межі слів, тому для отримання більш точного розколу використовуйте регулярний вираз із\w
preg_split('/[\s]+/',$string,1);
Це розділить слова з межами до межі 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
public function getStringFirstAlphabet($string){
$data='';
$string=explode(' ', $string);
$i=0;
foreach ($string as $key => $value) {
$data.=$value[$i];
}
return $data;
}
Ви можете зробити це за допомогою substr рядка функції PHP, не передаючи рядок у масив.
$string = 'some text here';
$stringLength= strlen($string);
echo ucfirst(substr($string,-$stringLength-1, 1));
// вихід S
Функція, яка буде токенізувати рядок на дві частини, перше слово та решту, що залишилася.
Повернене значення: воно буде мати 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 ()?
Ваше запитання може бути переформульоване як "замінити в рядку перший пробіл і все, що слідує нічим". Тож цього можна досягти простим регулярним виразом:
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
Я додав необов'язковий виклик до ltrim (), щоб бути безпечним: ця функція видаляє пробіли на початку рядка.
У всіх відповідях тут використовується підхід, необхідний процесору для пошуку всієї рядки, навіть якщо знайдено перше слово! Для великих струн це не рекомендується. Такий підхід є оптимальним:
function getFirstWord($string) {
$result = "";
foreach($string as $char) {
if($char == " " && strlen($result)) {
break;
}
$result .= $char;
}
return $result;
}
Якщо ви хочете знати , як швидко кожен з цих відповідних функцій, я побіг деякі сирої бенчмаркінгу в 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
Висновок Виявляється, що швидкість між цими функціями сильно змінюється і не є такою ж послідовною між тестовими запусками, як ви могли очікувати. Відповідно до цих швидких і брудних тестів, будь-яка з шести обраних функцій виконає роботу за розумну кількість часу. Існують збурення, включаючи інші запущені процеси, які перешкоджають виконанню часу. Тому просто використовуйте будь-яку функцію, яка має найбільш практичний і читабельний сенс для вас як програміста. Більшу картину програмування див. У грамотному програмуванні Дональда Кнута .
s($str)->words()[0]
корисні, як це знайдено в цій самостійній бібліотеці .