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!