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

时间:2010-03-19 11:26:17

标签: php string extract text-segmentation

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

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

结果输出应为Test,这是输入的第一个字。 我怎么能这样做?

22 个答案:

答案 0 :(得分:259)

有一个字符串函数(strtok)可用于根据某些分隔符将字符串拆分为较小的字符串( tokens )。出于此线程的目的,Test me more的第一个单词(定义为第一个空格字符之前的任何单词)可以通过标记空格字符上的字符串来获得。

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

有关详细信息和示例,请参阅strtok PHP manual page

答案 1 :(得分:212)

您可以使用explode功能,如下所示:

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

答案 2 :(得分:35)

如果你有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,它有很多答案使用它我不会打扰如何去做。

答案 3 :(得分:21)

你可以做到

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

答案 4 :(得分:11)

虽然现在已经很晚了,但PHP有一个更好的解决方案:

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

答案 5 :(得分:5)

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

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

答案 6 :(得分:4)

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

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

答案 7 :(得分:4)

使用分割功能也可以从字符串中获取第一个单词。

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

答案 8 :(得分:4)

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

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

//$first_word == 'Test'

答案 9 :(得分:3)

strtokextractpreg_*函数更快。

答案 10 :(得分:2)

个人strsplit / explode / strtok不支持字词边界,因此为了获得更准确的分割,请使用带有\w的正则表达式

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

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

答案 11 :(得分:1)

如果您想知道每个函数的运行速度,我在PHP 7.3中针对此处六个投票最多的答案(strpossubstrexplode运行了一些粗略的基准测试currentstrstrexplodetrimstr_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>';

?>

这是连续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's Literate Programming

答案 12 :(得分:1)

您可以使用PHP字符串函数substr进行操作,而无需将字符串包含在数组中。

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

//输出S

答案 13 :(得分:1)

public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}

答案 14 :(得分: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

答案 15 :(得分:1)

$input = "Test me more";
echo preg_replace("/\s.*$/","",$input); // "Test"

答案 16 :(得分:0)

将字符串标记为两部分的函数,第一个单词和剩余字符串。

返回值first数组中的remaining$return键分别为strpos( $title," ") !== falsefunction 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; } 。 如果字符串只有一个单词且没有空格,则必须首先检查Response::json($collection,200);

$MergeArray = $isConnectedM->merge($isConnectedA) ;
$resultArray = ['status' => 1, 'message' => 'Template uploaded!', 'dataArray' => $MergeArray];
return Response::json($resultArray,200);

答案 17 :(得分:0)

$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];

答案 18 :(得分:0)

$ first_word = str_word_count(1)[0]

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

有关更多信息,请检查is PHP str_word_count() multibyte safe?

答案 19 :(得分:0)

因为您无法使用strok检查大写或小写 这非常适合检查第一个单词。

if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }

答案 20 :(得分:0)

您可以将问题改写为“在字符串中替换第一个空格,然后将所有内容替换为空”。因此,可以通过一个简单的正则表达式来实现:

def my_function(a):
    ynew = [None]*(len(a)-1)
    for i in range(0, len(ynew)):
        if a[i] > a[i+1]:
            ynew[i] = 0
        else:
            ynew[i] = 1
    return ynew

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

答案 21 :(得分:0)

这里所有的答案都使用一种方法,即使找到第一个单词,处理器也需要搜索所有字符串!对于大字符串,不建议这样做。 这种方法是最佳的:

function getFirstWord($string) {
    $result = "";
    foreach($string as $char) {
        if($char == " " && strlen($result)) {
            break;
        }
        $result .= $char;
    }
    return $result;
}