129 votes

Quel est le plus efficace de tester si une chaîne PHP se termine avec une autre chaîne?

Le standard de PHP façon de tester si une chaîne de caractères $str se termine par une sous-chaîne de caractères $test est:

$endsWith = substr( $str, -strlen( $test ) ) == $test

Est-ce le moyen le plus rapide?

153voto

mcrumley Points 3551

Ce Assaf a dit est correct. Il est construit en fonction en PHP pour faire exactement cela.

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

Si $test est plus que $str PHP va donner un avertissement, de sorte que vous devez vérifier que le premier.

function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
}

68voto

jscheel Points 873

Cette méthode est un tout petit peu plus de mémoire-cher, mais c'est plus rapide:

stripos(strrev($haystack), $reversed_needle) === 0;

C'est mieux quand vous savez exactement ce que l'aiguille, de sorte que vous pouvez coder en dur elle a renversé. Si vous inversez l'aiguille par programmation, il devient plus lente que la méthode antérieure.

11voto

Vine Points 51

Voici une méthode simple pour vérifier si une chaîne de caractères se termine avec une autre, en donnant des strpos d'un décalage à droite, où la chaîne doit être trouvé:

function stringEndsWith($whole, $end)
{
    return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}

Simple, et je pense que c'vais travailler dans PHP 4.

8voto

Assaf Lavie Points 20181

Cela dépend de la sorte de l'efficacité des soins.

Votre version utilise plus de mémoire en raison de la copie supplémentaire de l'utilisation de substr.

Une version alternative peut rechercher la chaîne d'origine de la dernière occurrence de la sous-chaîne sans en faire une copie, mais serait probablement plus lent en raison de plus de tests.

Probablement le moyen le plus efficace est de faire la boucle de char par char de l'-sterlen(test) poste jusqu'à la fin de la chaîne et de les comparer. C'est le montant minimal de comparaisons que vous pouvez espérer de le faire et il n'y a guère plus de mémoire utilisée.

5voto

Gumbo Points 279147

Un autre moyen serait d'utiliser l' strrpos fonction de:

strrpos($str, $test) == strlen($str) - strlen($test)

Mais ce n'est pas plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X