如何从 PHP 字符串中删除第一个单词。

24

我想使用PHP从一个字符串中删除第一个单词。尝试搜索但找不到让我能够理解的答案。

例如:"白色背心",变成 "背心"。

谢谢


你是指第一个空格之前的字符吗? - PeeHaa
6个回答

66

不需要使用explode或数组操作,你可以使用函数strstr

echo strstr("White Tank Top"," ");
//Tank Top

更新:感谢 @Sid 提供的解答,为了去除额外的空格,您可以执行以下操作:

echo substr(strstr("White Tank Top"," "), 1);

12
这比数组操作的答案更好,但它会保留空格字符。可以通过执行 echo substr(strstr("White Tank Top"," "), 1); 来去掉空格。 - Sid
1
+1 简单易懂,我总是忘记 strtr。本来要用 strpos + substr 打出 3 行代码,但看到你的答案后就不用了。加上 ltrim 以防有多个空格,就万事大吉了。 - Fanis Hatzidakis
@Sid 你是指开头的空格吗?我刚检查了一下,对我来说运行得很好,你能验证一下吗? - amosrivera
@Fanis 我完全理解你,PHP 中有许多不同的字符串操作函数,很容易忘记。 - amosrivera
@amosrivera 像 @Sid 说的那样,它将包括正在匹配的空格。您不会通过在网页上回显来轻松地看到它,但可以使用 strlen 或在调试器中运行它,然后您就能发现它 :) - Fanis Hatzidakis
1
@Sid @Fanis strlen 函数显示了空格的有趣之处,感谢你们提供的解决方案! - amosrivera

8
您可以使用 preg_replace 函数,并使用正则表达式 ^(\w+\s) 匹配字符串的第一个单词:
$str = "White Tank Top";
$str = preg_replace("/^(\w+\s)/", "", $str);
var_dump($str); // -> string(8) "Tank Top"

3
function remove_word($sentence)
{
 $words=array_shift(explode(' ', $sentence));
 return implode(' ', $words);
}

?


你能把它简化成return implode(' ', array_shift(explode(' ', $sentence)));吗?我对PHP从来不是很确定。 - Patrick Perini
这个解决方案占用了大量内存。如果字符串有很多空格,数组将变得很大。amosrivera的解决方案要好得多(虽然不完全,因为它也保留了空格字符)。 - Sid
@Patrick Perini:不是,array_shift() 返回的是数组中的第一个元素,而不是修改后的数组。 - symcbean
@Sid:首先,amosrivera的答案在语义上有所不同(考虑一个不包含空格的字符串会发生什么),此外,我几乎不会称其为内存占用高的方法——我预计它将使用比amosrivera的答案更多的内存——但没有测试每种方法,我无法确定哪种对系统的有效占用空间更大。 - symcbean
无论是Hog还是不是,这个答案都缺少解释。关键是,你的代码片段执行了太多的爆炸操作。请看看我的有限爆炸。 - mickmackusa

1
function remove_word($sentence)
{
    $exp = explode(' ', $sentence);
    $removed_words = array_shift($exp);
    if(count($exp)>1){
        $w = implode(' ', $exp);
    }else{
        $w = $exp[0];
    }
    return $w;
}

尝试使用这个函数,希望它对您有用。

1
$string = 'White Tank Top';

$split = explode(' ', $string);
if (count($split) === 1) {
    // do you still want to drop the first word even if string only contains 1 word?
    // also string might be empty
} else {
    // remove first word
    unset($split[0]);
    print(implode(' ', $split));
}

-3

如果您的字符串中不能保证有空格,请小心选择不会在这种情况下失败的技术。

如果使用explode(),请确保限制爆炸以获得最佳效率。

演示

$strings = ["White", "White Tank", "White Tank Top"];
foreach ($strings as $string) {
    echo "\n{$string}:";
    echo "\n-\t" , substr($string, 1 + (strpos($string, ' ') ?: -1));

    $explodeOnce = explode(' ', $string, 2);
    echo "\n-\t" , end($explodeOnce);              

    echo "\n-\t" , substr(strstr($string, " "), 1);

    echo "\n-\t" , ltrim(strstr($string, " "));

    echo "\n-\t" , preg_replace('~^\S+\s~', '', $string);
}

输出:

White:
-   White
-   White
-                       // strstr() returned false
-                       // strstr() returned false  
-   White
White Tank:
-   Tank
-   Tank
-   Tank
-   Tank
-   Tank
White Tank Top:
-   Tank Top
-   Tank Top
-   Tank Top
-   Tank Top
-   Tank Top

我更喜欢使用正则表达式技术,因为它在所有情况下都很稳定,并且只需要一个函数调用。请注意,不需要捕获组,因为正在替换的是完整字符串匹配。 ^ 匹配字符串的开头,\S+ 匹配一个或多个非空白字符,\s 匹配一个空格字符。


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