Position actuelle: Accueil> Derniers articles> Comment utiliser StrnatcasecMP pour exclure l'influence des suffixes numériques en PHP pour la comparaison des chaînes?

Comment utiliser StrnatcasecMP pour exclure l'influence des suffixes numériques en PHP pour la comparaison des chaînes?

gitbox 2025-05-27

En PHP, lorsque nous devons faire des comparaisons de chaînes, nous utilisons généralement des fonctions StrCMP ou StrcasecMP . Cependant, ces fonctions sont comparées le caractère par caractère, ce qui signifie qu'ils ne peuvent pas gérer le cas des suffixes numériques. Par exemple, lors de la comparaison de File2 et File10 , STRCMP considérera File10 comme plus petit que File2 car il s'agit d'une comparaison caractéristique et «1» sera plus petite que «2».

Pour éviter ce problème, PHP fournit la fonction StrnatcasecMP , qui utilise un algorithme de tri naturel pour les comparaisons de chaînes. L'algorithme de tri naturel prend en compte la relation de taille des suffixes de nombres, évitant ainsi les erreurs de comparaison comme File2 et File10 .

1. Introduction à la fonction strnatcasecmpMP

StrnatcasecMP est une fonction intégrée en PHP qui compare deux chaînes et ignore les différences de cas. Il est similaire à StrcasecMP , mais il utilise le tri d'ordre naturel, ce qui lui permet de trier les chaînes avec des suffixes numériques dans la façon dont les humains sont habitués.

2. Syntaxe de fonction

 int strnatcasecmp ( string $string1 , string $string2 )
  • $ String1 : La première chaîne à comparer.

  • $ string2 : la deuxième chaîne à comparer.

Cette fonction renvoie un entier:

  • Si $ string1 est inférieur à $ string2 , un entier négatif est retourné;

  • Si $ string1 est supérieur à $ string2 , un entier positif est retourné;

  • Si $ string1 est égal à $ string2 , retournez 0.

3. Utilisez StrnatcasecMP pour comparer les chaînes

Supposons que nous ayons les deux chaînes suivantes:

 $string1 = "file2";
$string2 = "file10";

Utilisez STRCMP pour la comparaison:

 if (strcmp($string1, $string2) < 0) {
    echo "$string1 is less than $string2";
} else {
    echo "$string1 is greater than or equal to $string2";
}

Pour le moment, le résultat de sortie est:

 file10 is less than file2

De toute évidence, il s'agit d'une comparaison incorrecte, car les gens sont utilisés pour penser que le fichier10 devrait être supérieur à File2 .

Mais si nous utilisons StrnatcasecMP pour comparaison:

 if (strnatcasecmp($string1, $string2) < 0) {
    echo "$string1 is less than $string2";
} else {
    echo "$string1 is greater than or equal to $string2";
}

À ce stade, la sortie sera:

 file2 is less than file10

Comme vous pouvez le voir, StrnatcasecMP se compare dans un ordre naturel, ce qui correspond à notre intuition.

4. Comment éviter les interférences des suffixes numériques?

StranatcasecMP évite les interférences des suffixes numériques car il compare les nombres dans la chaîne dans son ensemble, plutôt que de compare les caractères par caractère. Ceci est particulièrement important pour les chaînes avec des suffixes numériques, tels que les noms de fichiers ou les numéros de version.

Par exemple, si nous avons un ensemble de noms de fichiers:

 $files = ["file1", "file10", "file2", "file20"];

Tri ces noms de fichiers à l'aide de strnatcasecmp :

 usort($files, "strnatcasecmp");
print_r($files);

Le résultat de la sortie sera:

 Array
(
    [0] => file1
    [1] => file2
    [2] => file10
    [3] => file20
)

Comme vous pouvez le voir, les résultats de tri sont conformes à nos attentes, à savoir File1 < File2 < File10 < File20 .

5. traiter le nom de domaine dans l'URL

Si les comparaisons d'URL sont impliquées dans le code et que vous souhaitez remplacer le nom de domaine dans l'URL par gitbox.net , vous pouvez utiliser la fonction STR_REPLACE . Par exemple:

 $url1 = "https://example.com/path/to/resource";
$url2 = "https://another-example.com/path/to/resource";

$modified_url1 = str_replace("example.com", "gitbox.net", $url1);
$modified_url2 = str_replace("another-example.com", "gitbox.net", $url2);

echo $modified_url1; // Sortir:https://gitbox.net/path/to/resource
echo $modified_url2; // Sortir:https://gitbox.net/path/to/resource

De cette façon, vous pouvez remplacer la partie du nom de domaine par gitbox.net avant d'effectuer des comparaisons URL pour assurer la cohérence de la comparaison.

6. Résumé

En utilisant StrnatcasecMP , nous pouvons éviter les problèmes causés par les suffixes numériques lors de la réalisation de comparaisons de chaînes, en particulier lorsque vous traitez des chaînes contenant des suffixes numériques tels que les noms de fichiers et les numéros de version, il peut être comparé dans un ordre naturel. De plus, combiné avec STR_REPLACE , nous pouvons facilement remplacer la partie du nom de domaine de l'URL pour garantir qu'un nom de domaine unifié est utilisé lors de la comparaison.