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 .
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.
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.
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.
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 .
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.
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.