如何在 PHP 中获得句子的第一个单词?

我想从字符串中提取变量的第一个单词:

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

结果输出应该是 Test,这是输入的第一个单词。 我怎么能这么做?

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

只需要使用 flash 来获取输入的每个单词并输出结果数组的第一个元素。

你可以的

echo current(explode(' ',$myvalue));

你可以使用 爆炸函数如下:

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

另一个例子:

$sentence = 'Hello World this is PHP';
$abbreviation = explode(' ', trim($sentence ))[0];
echo $abbreviation // will print Hello
$input = "Test me more";
echo preg_replace("/\s.*$/","",$input); // "Test"

如果你有 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 );

或使用爆炸,这有这么多的答案使用它,我不会费心指出如何做到这一点。

有一个字符串函数(Strtok) ,它可以用来根据一些分隔符将一个字符串拆分成更小的字符串(代币)。对于这个线程,Test me more的第一个单词(定义为第一个空格字符之前的任何单词)可以通过 做标记获得空格字符上的字符串。

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

有关更多细节和示例,请参见 PHP 手册页

使用拆分函数也可以得到字符串的第一个单词。

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

个人而言,strsplit/explode/strtok不支持单词边界,因此为了获得更精确的分割,可以使用 \w的正则表达式

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

这将使用边界将单词分割为1。

strtok extractpreg_*功能更快。

以防您不确定字符串是否以单词开头..。

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
$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

尽管有点晚,但 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'

$first _ word = str _ word _ count (1)[0]

对特殊字符不起作用,如果使用特殊字符将导致错误的行为。它对 UTF-8不友好。

更多信息请查看 PHP str _ word _ count ()多字节安全吗?

您的问题可以被重新表述为“替换字符串中的第一个空格和后面的所有空格”。所以这可以通过一个简单的正则表达式来实现:

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

为了安全起见,我已经添加了一个对 lrim ()的可选调用: 该函数删除字符串开头处的空格。

如果你想知道每个函数的速度有多快,我用 PHP 7.3对这里6个最受欢迎的答案(strpossubstrexplodecurrentstrstrexplodetrimstr_word_countstrtok)进行了粗略的基准测试,每个测试有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

结论结果表明,这些函数之间的速度差异很大,并且在测试运行之间并不像您期望的那样一致。根据这些快速简单的测试,选择的六个函数中的任何一个都可以在合理的时间内完成任务。存在一些扰动,包括正在运行的其他进程,这些扰动干扰了执行时间。因此,只要使用对程序员来说最实用、最易读的函数就可以了。有关更大的编程图片,请参见 唐纳德 · 克努斯的文学编程