使用 strpos 将单词与字符串末尾匹配

问题描述 投票:0回答:5

解决方案:

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
5个回答
11
投票

您可以使用

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
}

1
投票

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

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

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

1
投票

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

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

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


0
投票

您可以使用正则表达式

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

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


0
投票

使用

strrpos
的另一个稍短的解决方案:

$haystack = "foobar";
$needle = "bar";

if(false !== strrpos($haystack, $needle, -strlen($needle)))
    print "$haystack ends in $needle";

无需扫描整个

haystack
,只需要一次
strlen
调用。

© www.soinside.com 2019 - 2024. All rights reserved.