Php 将单词与字符串结尾与strpos匹配

Php 将单词与字符串结尾与strpos匹配,php,string,Php,String,解决方案: 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
被证明是最有效的。可以使用
substr
完成,但这会创建一个临时子字符串。也可以使用正则表达式完成,但速度比strpos慢,并且如果单词包含元字符,则不会始终生成正确的答案(请参见Ayman Hourieh注释)

选择答案:

if(strlen($str) - strlen($key) == strrpos($str,$key))
    print "$str ends in $key"; // prints Oh, hi O ends in O
最好测试严格的相等性
==
(参见David答案)

谢谢大家的帮助


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

基本上如果
$theWord=“我的话”

最有效的方法是什么

顺便说一句,我在标题中说了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);

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

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

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

如果
$theWord
包含元字符,则不会生成正确的输出。尝试将
$theWord
设置为
”。
例如。确实,您必须验证单词和/或转义元字符。这可能也比codaddict的第一个方法慢。此方法的缺点是您从“substr”结果创建临时字符串。codaddict提到的strrpos方法可能更快(尽管你想测试严格的相等性)。你说的“单词”是什么意思?空格分隔的文本?键“foo”是匹配“barfoo”还是只匹配“bar foo”?@Nick,如果
$word=“foo”然后两者都是
$station=“barfoo”或“barfoo”仍应
匹配
。在这种情况下,它前面是否有空格并不重要。regex解决方案的可能副本并不总是产生正确的结果。请看我对@jjclarkson答案的评论。@Ayman,谢谢你指出。将更新线程的摘要。@Aryam:OP希望匹配一个单词,而不仅仅是任何字符串。现在我假设一个单词是字母或字母数字。如果单词可以包含任何字符,其中一些可以是regex meta char,那么这将不起作用,我们将不得不转义meta。
$theWord = "my word";
$theWordLen = strlen($theWord);

$theString = "hello myword";
$matches = ($theWord ==substr($theString, -1 * $theWordLen);
if(strpos(strrev($haystack), strrev($needle))===0)