170

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

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

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

4

16 回答 16

312

有一个字符串函数 ( strtok ) 可用于根据某些分隔符将字符串拆分为更小的字符串 ( tokens )。就本线程而言,第一个单词(定义为第一个空格字符之前的任何内容)Test me more可以通过对空格字符上的字符串进行标记来获得。

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

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

于 2010-03-19T12:59:35.037 回答
282

您可以按如下方式使用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
于 2010-03-19T11:30:15.710 回答
43

如果你有 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,它有很多答案,我不会费心指出如何去做。

于 2010-03-19T11:33:06.920 回答
24

你可以做

echo current(explode(' ',$myvalue));
于 2010-03-19T11:29:25.183 回答
13

尽管为时已晚,但 PHP 有一个更好的解决方案:

$words=str_word_count($myvalue, 1);
echo $words[0];
于 2014-08-21T06:15:39.567 回答
7

与接受的答案类似,只需少一步:

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

//$first_word == 'Test'
于 2017-07-26T18:09:15.807 回答
5

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

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test
于 2012-09-17T12:57:26.540 回答
4

使用 split 函数也可以从字符串中获取第一个单词。

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>
于 2010-03-20T04:52:42.557 回答
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;

问候, 丘尔

于 2013-04-09T14:12:49.003 回答
4
<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

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

于 2010-03-19T11:29:22.650 回答
3

strtokextractorpreg_*函数更快。

于 2011-01-21T16:33:40.150 回答
2

个人strsplit//不支持单词边界,因此要获得更精确的拆分,请使用正则表达式explodestrtok\w

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

这会将带有边界的单词拆分为 1。

于 2010-09-13T15:21:29.657 回答
2
$input = "测试我更多";
echo preg_replace("/\s.*$/","",$input); // “测试”
于 2010-03-19T11:32:57.063 回答
2

如果你想知道每个函数的速度有多快,我在 PHP 7.3 中对这里投票最多的六个答案(strposwith substr, explodewith current, strstr, explodewith trim, str_word_countand 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

结论事实证明,这些函数之间的速度差异很大,并且在测试运行之间并不像您预期​​的那样一致。根据这些快速而肮脏的测试,所选择的六个函数中的任何一个都可以在合理的时间内完成工作。存在干扰,包括正在运行的其他进程会干扰执行时间。因此,只需使用对您作为程序员来说最实用和最易读的任何函数。有关更大的编程图景,请参阅Donald Knuth 的Literate Programming

于 2020-04-14T19:56:17.203 回答
0

$first_word = str_word_count(1)[0]

不适用于特殊字符,如果使用特殊字符会导致错误行为。它不是 UTF-8 友好的。

有关更多信息,请检查PHP str_word_count() 多字节安全吗?

于 2019-12-04T13:56:55.997 回答
0

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

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

为了安全起见,我添加了对 ltrim() 的可选调用:此函数删除字符串开头的空格。

于 2020-01-24T15:07:27.310 回答