Comparaison booléenne peu fiable en PHP : comprendre les bizarreries de strpos()
En PHP, la fonction strpos() est un outil fondamental pour recherche dans les chaînes. Cependant, un piège courant que rencontrent les programmeurs consiste à comparer le résultat de strpos() en utilisant l'opérateur d'égalité stricte (===) avec true.
Le problème :
Considérez l'extrait de code suivant :
$link = 'https://google.com'; $unacceptables = ['https:','.doc','.pdf', '.jpg', '.jpeg', '.gif', '.bmp', '.png']; foreach ($unacceptables as $unacceptable) { if (strpos($link, $unacceptable) === true) { echo 'Unacceptable Found<br />'; } else { echo 'Acceptable!<br />'; } }
Ce code tente de vérifier si l'URL $link contient l'une des chaînes répertoriées dans $inacceptables. Cependant, de manière inattendue, il affiche « Acceptable ! » dans tous les cas, même lorsque "https:" est présent dans $link.
La solution :
La racine du problème réside dans le comportement de PHP pour comparer le résultat de strpos(). Par défaut, strpos() renvoie un entier représentant la position de la première occurrence de la sous-chaîne dans la chaîne. Si la sous-chaîne n'est pas trouvée, elle renvoie false.
Dans l'extrait de code, lorsque vous comparez strpos() à true, vous vérifiez essentiellement si le résultat est un nombre autre que zéro. Étant donné que la fonction renvoie toujours un nombre lorsqu'elle trouve une correspondance, cette comparaison renvoie toujours vrai, indiquant de manière incorrecte la présence d'une sous-chaîne.
Pour résoudre ce problème, utilisez plutôt l'opérateur d'inégalité stricte (!==), qui vérifie la non-égalité. Cela garantit que la comparaison est faite avec false lorsque la sous-chaîne n'est pas trouvée.
// ... if (strpos($link, $unacceptable) !== false) {
En suivant cette simple modification, l'extrait de code identifiera correctement et imprimera "Inacceptable trouvé" lorsque l'URL $link en contient une. des sous-chaînes interdites.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!