Maison >développement back-end >tutoriel php >Pourquoi la comparaison strpos() avec `=== true` échoue-t-elle dans les recherches de chaînes PHP ?

Pourquoi la comparaison strpos() avec `=== true` échoue-t-elle dans les recherches de chaînes PHP ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-16 18:15:11223parcourir

Why Does strpos() Comparison with `=== true` Fail in PHP String Searches?

Vérité inattendue : Comprendre l'inadéquation dans les comparaisons strpos()

Malgré son utilisation courante pour les recherches de chaînes, la fonction PHP strpos() a un comportement non conventionnel lorsque l'on compare son résultat à vrai. Pour comprendre cette anomalie, examinons un extrait de code :

$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 />';
    }
}

Étonnamment, ce code affiche "Acceptable !" pour chaque élément du tableau $unacceptables, même si "https:" est présent dans la variable $link.

Pour résoudre ce casse-tête, nous devons nous plonger dans la sémantique de strpos(). Comme l'indique sa documentation, strpos() renvoie la "position numérique de la première occurrence" de la chaîne $inacceptable dans $link. Dans ce cas, strpos() trouve "https:" à la position 0 et renvoie 0, ce qui est une valeur véridique en PHP.

Par conséquent, la condition dans l'instruction if (strpos($link, $unacceptable) === true) est évalué à true à chaque fois car strpos() renvoie toujours une position numérique, qui est toujours contrainte à un booléen true.

Pour rectifier cela, nous doit utiliser un opérateur de comparaison non strict (!==) :

if (strpos($link, $unacceptable) !== false) {

En modifiant la comparaison en "pas égal à faux", nous garantissons que l'instruction if n'est évaluée qu'à vrai lorsque strpos() trouve une correspondance et renvoie une valeur non nulle (c'est-à-dire toute position numérique autre que 0).

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!

Déclaration:
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