web-dev-qa-db-fra.com

Comparaison de chaînes en utilisant == vs strcmp

Il semble que l'opérateur === de PHP est sensible à la casse? Y a-t-il une raison d'utiliser strcmp()? Est-il prudent de faire quelque chose comme:

if ( $password === $password2 ) { ... }
308
Jiew Meng

La raison de l’utiliser est parce que strcmp

renvoie <0 si str1 est inférieur à str2; > 0 si str1 est supérieur à str2 et 0 s'ils sont égaux.

=== ne renvoie que true ou false, il ne vous dit pas quelle est la chaîne "plus grande".

306
deceze

Vous ne devriez jamais utiliser == pour la comparaison de chaînes. === est OK.

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';

Il suffit de lancer le code ci-dessus et vous verrez pourquoi.

$something = 0;
echo ('password123' === $something) ? 'true' : 'false';

Maintenant, c'est un peu mieux.

209
postfuturist

N'utilisez pas == en PHP. Cela ne fera pas ce que vous attendez. Même si vous comparez des chaînes à des chaînes, PHP les convertit implicitement en float et effectue une comparaison numérique si elles apparaissent numériques.

Par exemple, '1e3' == '1000' renvoie true. Vous devriez utiliser === à la place.

96
Antimony

Eh bien..Selon ce rapport de bogue php , vous pouvez même vous faire avoir.

<?php 
    $pass = isset($_GET['pass']) ? $_GET['pass'] : '';
    // Query /?pass[]= will authorize user
    //strcmp and strcasecmp both are prone to this hack
    if ( strcasecmp( $pass, '123456' ) == 0 ){
      echo 'You successfully logged in.';
    }
 ?>

Cela vous avertit, mais contourne toujours la comparaison.
Vous devriez faire === comme @postfuturist l’a suggéré.

43
Ajith

Rappelez-vous toujours que lorsque vous comparez des chaînes, vous devez utiliser l'opérateur === (comparaison stricte) et l'opérateur pas == (comparaison approximative).

32
DataPriest

Utiliser == pourrait être dangereux.

Notez que la variable sera convertie en un autre type de données si les deux diffèrent.

Exemples:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

Comme vous pouvez le constater, ces deux types sont différents, mais le résultat est true, ce qui pourrait ne pas correspondre à ce que votre code attend.

Il est toutefois recommandé d’utiliser === car le test montre qu’il est un peu plus rapide que strcmp() et que son alternative insensible à la casse strcasecmp().

Google goûte rapidement cette comparaison de vitesse: http://snipplr.com/view/758/

20
Nikola Petkanski

Résumant toutes les réponses:

  • == est une mauvaise idée pour les comparaisons de chaînes .
    Cela vous donnera des résultats "surprenants" dans de nombreux cas. Ne lui faites pas confiance.

  • === est correct et vous donnera les meilleures performances.

  • strcmp() devrait être utilisé si vous devez déterminer quelle chaîne est "plus grande", généralement pour les opérations de tri.

19
Balmipour

strcmp () et "===" sont tous les deux sensibles à la casse mais "===" est beaucoup plus rapide

exemple de code: http://snipplr.com/view/758/

10
ungalcrys

strcmp renverra différentes valeurs en fonction de l'environnement sous lequel il est exécuté (Linux/Windows)!

La raison en est qu’il ya un bogue, comme le dit le rapport de bogue https://bugs.php.net/bug.php?id=53999

S'il vous plaît manipuler avec soin !! Merci.

6
kta

La fonction peut aussi aider au tri. Pour être plus clair sur le tri. strcmp () renvoie moins de 0 si chaîne1 trie avant chaîne2, supérieur à 0 si chaîne2 trie avant chaîne1 ou 0 si elles sont identiques. Par exemple 

$first_string = "aabo";
$second_string = "aaao";
echo $n = strcmp($first_string,$second_string);

La fonction retournera supérieure à zéro, car aaao trie avant aabo.

3
HTML Man

Vous pouvez utiliser strcmp() si vous souhaitez commander/comparer des chaînes lexicographiquement . Si vous souhaitez simplement vérifier l’égalité, alors == convient parfaitement.

3
Daniel Egeberg

PHP Au lieu d'utiliser un tri alphabétique, utilisez la valeurASCIIdu caractère pour effectuer la comparaison. Les lettres minuscules ont une valeur plus élevéeSCICIIque les majuscules. Il est préférable d'utiliser l'opérateur d'identité === pour effectuer ce type de comparaison. strcmp () est une fonction permettant d'effectuer des comparaisons de chaînes binaires sûres. Il prend deux chaînes comme arguments et renvoie <0 si str1 est inférieur à str2; > 0 si str1 est supérieur à str2 et 0 s'ils sont égaux. Il existe également une version insensible à la casse nommée strcasecmp () qui convertit d’abord les chaînes en minuscules puis les compare.