Maison > développement back-end > tutoriel php > Pourquoi l'égalité stricte avec `strpos()` en PHP produit-elle souvent des résultats inattendus ?

Pourquoi l'égalité stricte avec `strpos()` en PHP produit-elle souvent des résultats inattendus ?

Susan Sarandon
Libérer: 2024-12-16 15:18:20
original
196 Les gens l'ont consulté

Why Does Strict Equality with `strpos()` in PHP Often Produce Unexpected Results?

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 />';
    }
}
Copier après la connexion

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) {
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal