2010-03-27 2 views
5

Solution: strpos s'est avéré être le plus efficace. Peut être fait avec substr mais cela crée une sous-chaîne temporaire. Peut aussi être fait avec regex, mais plus lentement que strpos et ne produit pas toujours la bonne réponse si le mot contient des méta-caractères (voir le commentaire d'Ayman Hourieh).correspondant un mot à la fin de la chaîne avec strpos

Choisi réponse:

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

et mieux pour tester l'égalité stricte === (voir réponse David)

Merci à tous pour aider. J'essaie de faire correspondre un mot dans une chaîne pour voir si elle se produit à la fin de cette chaîne. L'habitude strpos($theString, $theWord); ne ferait pas cela.

Fondamentalement, si $theWord = "my word";

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

Quelle serait la façon la plus efficace de le faire?

P.S. Dans le titre j'ai dit strpos, mais si un meilleur moyen existe, c'est ok aussi.

+0

Que voulez-vous dire par "mot"? Texte délimité par l'espace? Est-ce que la clé "foo" correspondrait à "barfoo" ou seulement à "bar foo"? –

+0

@Nick, si '$ word =" foo ";' alors à la fois '$ phrase =" barfoo "ou" bar foo ";' devrait toujours 'match'. Ce n'est pas important dans ce cas s'il a un espace avant ou non. – clover

+0

duplicata possible de [Quel est le test le plus efficace de savoir si une chaîne PHP se termine par une autre chaîne?] (Http://stackoverflow.com/questions/619610/whats-the-most-efficient-test-of-whether-a- php-string-ends-with-another-string) – Gajus

Répondre

5

Vous pouvez utiliser la fonction strrpos pour cela:

$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 

ou une solution à base de regex comme:

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

La solution regex ne produit pas toujours des résultats corrects. Voir mon commentaire sur la réponse @ jjclarkson. –

+0

@Ayman, merci de l'avoir signalé. Mettra à jour le résumé du fil. – clover

+0

@Aryam: OP veut faire correspondre un mot pas n'importe quelle chaîne. Maintenant, j'ai supposé qu'un mot serait alphabétique ou alphanumérique. Si le mot peut contenir n'importe quel caractère dont certains peuvent être regex meta char, cela ne fonctionnera pas et nous devrons échapper les metas. – codaddict

0

Vous pouvez utiliser un regular expression. Vous pouvez utiliser strrpos() ou ajouter la longueur du mot. (strrpos - "Trouver la position de la dernière occurrence d'un caractère dans une chaîne") Ensuite, voir si c'est la position du dernier caractère de la chaîne.

+2

Ne produit pas la sortie correcte si '$ theWord' contient des méta-caractères. Essayez-le avec '$ theWord' réglé sur' '.'' par exemple. –

+0

Tout à fait vrai, vous devez absolument valider le mot et/ou échapper à des méta-caractères. – jjclarkson

+0

C'est probablement plus lent que la première méthode de codaddict aussi. –

1

strpos pourrait être le plus efficace dans certains cas, mais vous pouvez aussi substr avec une valeur négative comme second paramètre à compter à rebours à partir de la fin de la chaîne:

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

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

L'inconvénient de cette méthode est que vous créez une chaîne temporaire à partir du résultat "substr". La méthode strrpos mentionnée par codaddict est probablement plus rapide (bien que vous vouliez tester l'égalité stricte). – David

Questions connexes