W3docs

strncmp()

La fonction strncmp() en PHP compare les N premiers caractères de deux chaînes de façon binaire et sensible à la casse.

Introduction

La fonction strncmp() en PHP effectue une comparaison binaire et sensible à la casse des N premiers caractères de deux chaînes. Au lieu de comparer les chaînes en entier, elle n'examine que la portion initiale que vous spécifiez — ce qui en fait le bon outil lorsque vous vous intéressez à un préfixe plutôt qu'à la valeur complète (par exemple, vérifier si une URL commence par https, ou regrouper des codes partageant un en-tête commun).

Cet article couvre la syntaxe de strncmp(), comment interpréter sa valeur de retour, plusieurs exemples pratiques, ainsi que les pièges courants à éviter.

Syntaxe

strncmp(string $string1, string $string2, int $length): int
ParamètreDescription
$string1La première chaîne à comparer.
$string2La deuxième chaîne à comparer.
$lengthLe nombre maximal de caractères à comparer depuis le début de chaque chaîne.

strncmp() compare les $length premiers caractères de $string1 et $string2 octet par octet et renvoie un entier :

Valeur de retourSignification
< 0 (négatif)$string1 est « inférieure » à $string2 dans la plage comparée.
0Les $length premiers caractères sont égaux.
> 0 (positif)$string1 est « supérieure » à $string2 dans la plage comparée.

La comparaison est lexicographique, basée sur la valeur en octet de chaque caractère. Étant donné que les lettres ASCII majuscules (AZ, codes 65–90) précèdent les minuscules (az, codes 97–122), "Apple" est considéré comme inférieur à "apple". Le nombre non nul exact correspond à la différence de valeur en octet du premier caractère différent, mais vous ne devriez vous fier qu'à son signe, pas à sa magnitude.

Exemple : comparer un préfixe

<?php

$string1 = "Hello World";
$string2 = "Hello";
$length = 5;

$result = strncmp($string1, $string2, $length);

if ($result < 0) {
  echo "The first $length characters of $string1 are less than the first $length characters of $string2";
} elseif ($result > 0) {
  echo "The first $length characters of $string1 are greater than the first $length characters of $string2";
} else {
  echo "The first $length characters of $string1 are equal to the first $length characters of $string2";
}

Même si "Hello World" et "Hello" diffèrent globalement, leurs 5 premiers caractères ("Hello") sont identiques, donc strncmp() renvoie 0 et la sortie est :

The first 5 characters of Hello World are equal to the first 5 characters of Hello

Exemple : vérifier si une chaîne commence par un préfixe

Un usage classique de strncmp() est de tester un préfixe. En passant la longueur du préfixe comme $length, vous ne comparez que la portion de la chaîne cible couverte par le préfixe :

<?php

$url = "https://www.w3docs.com";

if (strncmp($url, "https", 5) === 0) {
  echo "Secure URL";
} else {
  echo "Not secure";
}

Cela affiche Secure URL. Sur PHP 8.0+, la fonction dédiée str_starts_with() exprime la même intention plus clairement, mais strncmp() reste le choix portable pour les versions plus anciennes.

Exemple : sensibilité à la casse

strncmp() distingue les majuscules des minuscules :

<?php

echo strncmp("PHP", "php", 3); // negative: 'P' (80) < 'p' (112)

Si vous avez besoin d'ignorer la casse, utilisez strncasecmp() à la place, qui effectue la même comparaison limitée en longueur sans sensibilité à la casse.

Pièges courants

  • Seul le signe est significatif. Traitez le résultat comme « négatif / zéro / positif », et préférez === 0 lorsque vous voulez dire « les préfixes correspondent ». Ne supposez pas que la valeur est exactement -1, 0 ou 1 — elle peut être n'importe quel entier.
  • Un $length supérieur à la longueur des chaînes est acceptable. Si $length dépasse la longueur de l'une ou l'autre chaîne, strncmp() compare simplement jusqu'à la fin de la plus courte. strncmp("Hi", "Hi", 50) renvoie 0.
  • Un $length négatif déclenche une ValueError sur PHP 8.0+ (et était traité comme 0 sur les versions plus anciennes).
  • La fonction est basée sur les octets, pas sur le multi-octet. Pour du texte UTF-8, $length compte les octets, pas les caractères, donc un caractère multi-octet peut être divisé. Les données ASCII pures ne sont pas affectées.

Fonctions associées

  • strcmp() — compare deux chaînes complètes, en tenant compte de la casse.
  • strncasecmp() — comme strncmp(), mais insensible à la casse.
  • strcasecmp() — comparaison insensible à la casse de chaînes complètes.
  • substr_compare() — compare des chaînes à partir d'un décalage choisi.
  • strpos() — trouve la position d'une sous-chaîne.

Conclusion

strncmp() compare uniquement les N premiers caractères de deux chaînes, en tenant compte de la casse et de façon binaire, en renvoyant un nombre négatif, 0 ou un nombre positif. Utilisez-la lorsque vous avez besoin de faire correspondre un préfixe ou de comparer une portion initiale de longueur fixe de deux chaînes — et n'oubliez pas de vérifier le signe du résultat avec === 0, < 0 ou > 0 plutôt qu'une valeur exacte.

Pratique

Pratique
Quelle est la fonction de strncmp() en PHP ?
Quelle est la fonction de strncmp() en PHP ?
Was this page helpful?