2010-03-07 9 views
19
if(strpos("http://www.example.com","http://www.")==0){ // do work} 

Je m'attendrais à ce que cela soit résolu comme vrai, ce qui est le cas. Mais ce qui se passe quand je faisphp 5 strpos() différence entre renvoyer 0 et false?

if(strpos("abcdefghijklmnop","http://www.")==0){// do work} 

Cela passe aussi php 5 car pour autant que je peux travailler les strpos retourne false qui se traduit par 0.

Est-ce correct penser/comportement? Si oui, quelle est la solution de contournement pour tester qu'une sous-chaîne est au début d'une autre chaîne?

Répondre

39

Oui, ce comportement est correct/attendu:

  • strpos peut revenir 0 quand il y a un match au début de la chaîne
  • et il renverra false lorsqu'il n'y a pas de correspondance

La chose est que vous ne devriez pas utiliser == pour comparer 0 et false; vous devez utiliser ===, comme ceci:

if(strpos("abcdefghijklmnop","http://www.") === 0) { 

} 

Ou:

if(strpos("abcdefghijklmnop","http://www.") === false) { 

} 


Pour plus d'informations, voir Comparison Operators:

  • $a == $b seront TRUE si $a est égal à $b.
  • $a === $b seront TRUE si $a est égal à $b, et ils sont du même type.

Et, citant the manual page of strpos:

Cette fonction peut retourner FALSE, mais peut aussi retourner une valeur non booléenne qui évalue à FALSE, comme 0 ou "".
S'il vous plaît lire la section sur Booleans pour plus d'informations.
Utilisez the === operator pour tester la valeur de retour de cette fonction.

9

=== et !== comparer le type et valeur:

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work} 
4

strpos renvoie un int ou un booléen faux. l'opérateur == évalue aussi 0 pour signifier faux, vous voulez utiliser l'opérateur === (trois signes égaux) qui vérifie également que les types comparés sont les mêmes au lieu de simplement voir si on peut les évaluer pour signifier la même chose.

si

if (strpos($hastack, $needle) === 0) 
{ 
    // the $needle is found at position 0 in the $haystack 
} 
1

0 est une valeur de retour possible de strpos quand il trouve une correspondance au début. Dans le cas où la correspondance n'est pas trouvée, elle renvoie false (booléen). Vous devez donc vérifier la valeur de retour de strpos en utilisant l'opérateur === qui vérifie la valeur et le type plutôt que d'utiliser == qui vérifie simplement la valeur.

0

je tends personnellement à utiliser cette façon:

if(!strpos($v,'ttp:'))$v='http://'.$v; 

ou

if(strpos(' '.$v,'http')) 

pour éviter la position puis faire toujours un nombre plus 0 Cheers "0"

+1

Si votre code utilise des moyens non standard en notation non standard pour résoudre les problèmes standard tout maintenabilité a quitté le bâtiment. Chaque développeur PHP décent sait et attend la notation '===' - votre réponse présente juste une performance obsolète et un tueur de lisibilité. –