解决方案:
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
,但如果存在更好的方法,那也可以。
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
}
strpos 在某些情况下可能是最有效的,但您也可以使用负值作为第二个参数来 substr 从字符串末尾向后计数:
$theWord = "my word";
$theWordLen = strlen($theWord);
$theString = "hello myword";
$matches = ($theWord ==substr($theString, -1 * $theWordLen);
为什么不按预期反转字符串并使用 strpos :
if(strpos(strrev($haystack), strrev($needle))===0)
确实,strrev 会弄乱多字节字符,但由于 haystack 和 Needle 都同样弄乱,所以它仍然可以正常工作。我做了一些测试,这比任何其他方法都要快。不过可能会消耗更多内存。
使用
strrpos
的另一个稍短的解决方案:
$haystack = "foobar";
$needle = "bar";
if(false !== strrpos($haystack, $needle, -strlen($needle)))
print "$haystack ends in $needle";
无需扫描整个
haystack
,只需要一次strlen
调用。