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

180

我想从字符串中提取一个变量的第一个单词,例如,对于以下输入:

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

我需要的输出结果应该是输入内容的第一个单词Test。我该如何做到这一点?


你可能会发现s($str)->words()[0]很有用,它可以在这个独立库中找到。 - caw
获取第一个字符出现之前的子字符串时可能出现的一些边缘情况的小表格:https://dev59.com/P0jSa4cB1Zd3GeqPFXA_#68123370 - mickmackusa
17个回答

328

有一个字符串函数(strtok),可以根据某些分隔符将字符串分割成更小的字符串(tokens)。对于本主题,可以通过在空格字符上进行tokenize来获取Test me more的第一个单词(定义为在第一个空格字符之前的任何内容)。

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

更多详细信息和示例,请参阅strtok PHP手册页面


4
太棒了!比原来的解决方案更好。 - Alberto Fontana
这应该是第一个答案。它以更简洁的方式仅返回第一个单词,就像他想要的那样。 - Wes
2
这是一个不错的解决方案,但在 PHP 手册中警告说:此函数可能返回布尔值 FALSE,但也可能返回一个被视为 FALSE 的非布尔值。 - Jay Harris
2
我每天至少使用6年PHP,直到现在我从未听说过这个函数。 - Epoc
7
strtok 是一个奇怪而且危险的函数,它保存了一个全局状态。不建议使用这个函数。 - Arnold Daniels
不起作用。请尝试使用此字符串:“\n\nNextWord”。此答案假定所有单词仅由空格分隔。 - Dev Null

292

你可以使用explode函数,方法如下:

$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

52
使用现代的PHP语法,您可以使用explode(' ',trim($myvalue))[0]来实现。这将返回字符串中以空格分隔的第一个单词,并去除前后空格。 - Elly Post
3
针对任何 PHP 版本的一行代码:list($firstword) = explode(' ', trim($myvalue), 1);意思是将变量 $myvalue 中的第一个单词提取出来,赋值给变量 $firstword。如果 $myvalue 中包含多个单词,则忽略后面的内容。 - Cédric Françoys
3
@CédricFrançoys,“limit”参数应该是2,因为它必须包括包含字符串剩余部分的最后一个元素;如果是1,则只会返回相同的字符串。除非创建一个大数组,否则我会选择Elliot版本作为一行代码的解决方案。 - Sdlion
如果您想要从RSS [NewYorkTimes](http://rss.nytimes.com/services/xml/rss/nyt/Sports.xml)获取第二个单词 - media:credit是 - <media:credit> Dmitry Kostyukov for The New York Times </ media:credit>。我只想要Dmitry Kostyukov - 我该如何做? =) - user7637389
不起作用。请尝试使用此字符串:“\n\nNextWord”。此答案假定所有单词仅由空格分隔。 - Dev Null
显示剩余5条评论

45

如果您有 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,不使用explode或regex(在我看来都不合适)。另一种选择是使用strstr和str_replace,将strstr中针后面的部分替换为空。 - Gordon
1
值得注意的是,尽管strstr自PHP 4.3.0版本以来就可用,但在5.3.0之前,它并没有添加可选参数before_needle(您在此示例中使用)。这只是一个提示,因为我曾经困惑过,为什么您会声明此示例需要5.3.0 - trejder
请注意,如果您将myvalue设置为单个单词,则在这种情况下strstr不会返回任何内容!一种解决方法是始终在被测试的字符串末尾添加一个空格,这样它总是返回第一个单词,即使该单词是字符串中唯一的单词! - patrick
1
假设只有单词之间的空格是有风险的,我也会包括制表符。 - user2098467
1
难道不应该是 echo $i === false ? $myvalue : substr( $myvalue, 0, $i ); 吗? - But those new buttons though..
不起作用。请尝试使用此字符串:“\n\nNextWord”。此答案假定所有单词仅由空格分隔。 - Dev Null

24

你可以这样做

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

不起作用。请使用此字符串尝试:“\n\nNextWord”。此答案假定所有单词仅由空格分隔。 - Dev Null
1
原始问题的示例数据中不包含任何前导换行符。 - mickmackusa

15

虽然可能有点晚,但是 PHP 有一个更好的解决方案:

$words=str_word_count($myvalue, 1);
echo $words[0];

7
与已接受的答案类似,但少了一步:

与已接受的答案类似,但少了一步:

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

//$first_word == 'Test'

不起作用。请尝试使用此字符串:“\n\nNextWord”。此答案假定所有单词仅由空格分隔。 - Dev Null
是的,这确实假设一个“句子”由用空格分隔的单词构成。 - wheelmaker
我认为你没有理解重点。我将单词中的“W”大写,以便您更容易阅读。也许这样对您来说会更有意义 - “\n\nThis won't work”。上述代码将认为第一个单词是“\n\nThis”。 - Dev Null
这个晚了、多余的、没有解释的回答错过了限制爆炸数量的好机会。 - mickmackusa
这是我一生中第一次希望有更少爆炸的时候。 - undefined
哈哈,谢谢@mickmackusa的评论。 - undefined

5

如果你不确定字符串是否以单词开头...

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

1
在此情况下,使用trim($input)即可。 :P - zanderwar
我不会捕获\s*。我也不会写[^\s],因为\S更简单。我也不会捕获结尾的.*。这个答案对于这么小的代码片段做了太多不必要的事情。 - mickmackusa

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

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


不起作用。请尝试使用此字符串:“\n\nNextWord”。此答案假定所有单词之间仅由空格隔开。 - Dev Null
这个答案没有限制爆炸的数量,因此可能会做比所需更多的工作。 - mickmackusa

4
$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
这将是最佳答案,因为它也适用于“one, two and three”(被接受的答案会回应“one,”) - patrick
如果字符类有[a-zA-Z]或者你正在使用\w,为什么要使用i模式修饰符?如果第一个“单词”包含撇号或连字符,输出应该是什么?这是值得思考的问题。这个未经解释的答案教授了一些不必要的东西。 - mickmackusa

3
使用split函数,您也可以从字符串中获取第一个单词。
<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>

5
注意:从5.3版本开始,split()已经被弃用。 - Leo
split() 没有限制,因此这种技术会过度运作。它只需要在第一个出现的空格上分裂,才能正确地完成工作。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接