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


Answers:


254

您可以按以下方式使用爆炸功能:

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

让它变成100,对我有帮助:)
Shivam Pandya

41
使用现代PHP语法,您可以做explode(' ',trim($myvalue))[0]
Elly发表

2
:对于任何PHP版本1个码list($firstword) = explode(' ', trim($myvalue), 1);
塞德里克Françoys

3
@CédricFrançoys limit参数应为2,因为它必须包含包含字符串其余部分的最后一个元素;1只会返回相同的字符串。除非创建一个大型阵列,否则我将使用Elliot版本的一个衬板。
Sdlion '17

如果您想要第二个单词以及RSS NewYorkTimes的第二个单词-media:credit是-<media:credit> Dmitry Kostyukov for the New York Times </ media:credit>,该怎么办?我只想要Dmitry Kostyukov-我该怎么做?=)

282

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

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

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


3
太棒了!比原始解决方案更好
Alberto Fontana 2015年

这应该是第一个答案。它只会像他想要的那样以更简洁的方式返回第一个单词。
韦斯

2
好的解决方案,但是在php手册中,它警告:此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。
杰·哈里斯

1
我每天使用PHP至少已有6年了,直到现在我才听说过此功能
Epoc

2
strtok是一个具有全局状态的奇怪而危险的功能。不建议使用此功能。
阿诺德·丹尼尔斯

39

如果您有PHP 5.3

$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);

请注意,在这种情况下,如果if $myvalue是具有一个单词的字符串,strstr则不会返回任何内容。一种解决方案是在测试字符串后添加一个空格:

echo strstr( $myvalue . ' ', ' ', true );

即使该字符串中只有一个单词,也将始终返回该字符串的第一个单词

替代方法是这样的:

$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );

或使用爆炸,使用爆炸有很多答案,我不会费心指出如何做。


1
+1表示不使用explode或正则表达式(均为不合适的恕我直言)。另一种选择是将strstr与str_replace一起使用,将strstr的指针之后的部分替换为空。
戈登

1
值得一提的是,虽然strstrPHP可用,因为4.3.0它不是在之前5.3.0,当添加了可选参数before_needle(在本示例中使用的参数)时。请注意,由于我感到困惑,您为何要声明此示例需要5.3.0
trejder

请注意,如果将myvalue设置为单个单词,则strstr在这种情况下不会返回任何内容!一个解决方案可能是始终在测试的字符串的末尾添加一个空格,这样即使它是字符串中的唯一单词,它也总是返回第一个单词!
patrick

1
假设单词之间只有空格是有风险的,我还将包括制表符。

不应该那样echo $i === false ? $myvalue : substr( $myvalue, 0, $i );


13

即使为时不晚,但是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'

5

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

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

trim($input)在这种情况下就足够了:P
zanderwar

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

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


4

使用拆分功能,您还可以从字符串中获取第一个单词。

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

5
注意:split()从5.3>开始
Leo


2
$ input =“进一步测试我”;
回声preg_replace(“ / \ s。* $ /”,“”,$ input); //“测试”

2

个人strsplit/ explode/ strtok不支持单词边界,所以要得到与更accute分裂使用正则表达式\w

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

这会将带有边界的单词分割为1个限制。


RobertPitt->如果您举一个例子,与preg_split相比,strtok的单词边界失败,将很有帮助。
MarcoZen

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


这将是最好的答案,因为它也适用于“一,二和三”(接受的答案将回显“一”)
patrick

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

1

您可以使用PHP字符串函数substr来完成此操作,而不必将字符串转换为数组。

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

//输出S


接收MySQL查询的首字母以识别查询操作(例如选择,插入或更新)的绝佳解决方案
Intacto

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

0

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

返回值:分别具有firstremaining键入$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;
}


0

由于您不能使用strok来检查大写或小写,因此非常适合检查第一个单词。

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

0

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

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

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


0

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

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

0

如果你想知道如何快速每一种各自的功能是,我跑了一些原油在PHP 7.3基准上六种最投票在这里回答(strpossubstrexplodecurrentstrstrexplodetrimstr_word_countstrtok),每百万次迭代来比较它们的速度。

<?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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.