【问题标题】:matching a word to end of string with strpos用 strpos 匹配一个单词到字符串的结尾
【发布时间】:2011-02-01 11:11:52
【问题描述】:

解决方案: strpos 原来是最有效的。可以使用substr 完成,但这会创建一个临时子字符串。也可以使用正则表达式完成,但比 strpos 慢,并且如果单词包含元字符,则并不总是产生正确的答案(请参阅 Ayman Hourieh 评论)。

选择的答案:

if(strlen($str) - strlen($key) == strrpos($str,$key))
    print "$str ends in $key"; // prints Oh, hi O ends in O

最好测试严格相等===(见大卫回答)

感谢大家的帮助。


我正在尝试匹配字符串中的一个单词,以查看它是否出现在该字符串的末尾。通常的strpos($theString, $theWord); 不会那样做。

基本上如果$theWord = "my word";

$theString = "hello myword";        //match
$theString = "myword hello";        //not match
$theString = "hey myword hello";    //not match

最有效的方法是什么?

附:在标题中我说strpos,但如果有更好的方法,那也没关系。

【问题讨论】:

标签: php string


【解决方案1】:

您可以使用regular expression

if(preg_match('/'.$theWord.'$/', $theString)) {
    //matches at the end of the string
}

或者您可以使用strrpos() 并添加单词的长度。 (strrpos — "查找一个字符在字符串中最后出现的位置") 然后看看那是不是字符串中最后一个字符的位置。

【讨论】:

  • 如果$theWord 包含元字符,则不会产生正确的输出。例如,将$theWord 设置为'.' 试试。
  • 非常正确,您肯定必须验证单词和/或转义元字符。
  • 这可能也比 codaddict 的第一种方法慢。
【解决方案2】:

您可以为此使用strrpos 函数:

$str = "Oh, hi O";
$key = "O";

if(strlen($str) - strlen($key) == strrpos($str,$key))
    print "$str ends in $key"; // prints Oh, hi O ends in O

或基于正则表达式的解决方案:

if(preg_match("#$key$#",$str)) {
 print "$str ends in $key"; // prints Oh, hi O ends in O
}

【讨论】:

  • 正则表达式解决方案并不总是产生正确的结果。请参阅我对@jjclarkson 的回答的评论。
  • @Ayman,感谢您指出。将更新线程的摘要。
  • @Aryam:OP 想要匹配一个单词而不仅仅是任何字符串。现在我假设一个词是字母或字母数字的。如果单词可以包含任何字符,其中一些可以是正则表达式元字符,这将不起作用,我们将不得不转义元数据。
【解决方案3】:

strpos 在某些情况下可能是最有效的,但您也可以使用负值作为第二个参数的 substr 从字符串末尾倒数:

$theWord = "my word";
$theWordLen = strlen($theWord);

$theString = "hello myword";
$matches = ($theWord ==substr($theString, -1 * $theWordLen);

【讨论】:

  • 此方法的缺点是您正在从“substr”结果创建一个临时字符串。 codaddict 提到的 strrpos 方法可能更快(尽管您想测试严格相等)。
【解决方案4】:

为什么不按预期反转字符串并使用 strpos:

if(strpos(strrev($haystack), strrev($needle))===0)

确实 strrev 会弄乱多字节字符,但是由于 haystack 和 needle 都被同样弄乱了,它仍然可以正常工作。我做了一些测试,这比任何其他方法都快。可能会消耗更多的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多