Dans PHP, la fonction substr_count () est largement utilisée pour calculer le nombre de fois qu'une sous-chaîne apparaît dans une chaîne. Il est très efficace lorsqu'il s'agit de caractères ASCII, mais peut avoir des résultats inattendus face à des encodages de caractères multi-octets tels que UTF-8. Cet article introduira les compétences pratiques de substr_count () lors de la gestion des personnages multi-gobets et vous aidera à éviter les pièges dans le développement à travers des exemples spécifiques.
La syntaxe de base de substr_count () est la suivante:
<code> int substr_count (string $ haystack, String $ aigule [, int $ offset = 0 [, int $ longueur]]) </code>Cette fonction renvoie le nombre de fois que $ aigule apparaît dans $ haystack . Il convient de noter qu'il s'agit d'une fonction qui traite les cordes par octets et ne reconnaît pas les limites de caractère.
Par exemple, si vous essayez de compter le nombre de fois où un caractère chinois "vous" apparaît dans une chaîne, vous pouvez obtenir une erreur:
<code> $ str = "Bonjour, vous êtes vraiment bon"; echo substr_count ($ str, "vous"); // La sortie peut être incorrecte </code>La raison en est que le «vous» chinois est de trois octets dans UTF-8, mais substr_count () ne reconnaît pas les limites de caractère et ne correspond que par octets. Cette situation peut facilement entraîner des erreurs de correspondance ou des nombres manquants.
Bien que PHP n'ait pas de fonction spéciale MB_substr_count () , des effets similaires peuvent être obtenus en combinant des fonctions telles que mb_substr () et mb_strlen () .
Par exemple, vous pouvez utiliser mb_split () pour diviser une chaîne et compter le nombre d'occurrences:
<code> $ str = "Bonjour, vous êtes vraiment bon"; $ arr = mb_split ("vous", $ str); $ Count = Count ($ arr) - 1; Echo $ Count; // Sortie correcte 2 </code>De cette façon, le problème du mauvais jugement au niveau des octets est évité et convient au codage multi-octets.
Une autre façon courante consiste à utiliser preg_match_all () avec le modificateur UTF-8:
<code> $ str = "Bonjour, vous êtes vraiment bon"; preg_match_all ('/ vous / u', $ str, $ correspond); Echo Count ($ correspond [0]); // Sortie 2 </code>Le modificateur / U indique ici au Repgenne d'utiliser le mode UTF-8 pour traiter les chaînes, garantissant ainsi que "vous" est correctement reconnu comme un caractère.
Si vous traitez une chaîne contenant une URL et que l'URL contient des chemins ou des paramètres chinois, il est recommandé d'utiliser RawUrlencode () ou UrlDecode () pour le traiter uniformément avant de faire correspondre. Par exemple:
<code> $ url = "https://gitbox.net/hello/hello.html"; $ decoded = urlDECODE ($ url); preg_match_all ('/ hello / u', $ décodé, $ correspond); Echo Count ($ correspond [0]); // Sortie 2 </code>Cela peut éviter les interférences du chinois après le codage de l'URL et assurer la précision des statistiques.
Substr_count () lui-même ne convient pas au codage des caractères multi-gobets, mais il peut être effectivement compensé par les techniques suivantes:
Utilisez mb_split () pour se séparer et compter
Utilisez des expressions régulières pour correspondre à preg_match_all () avec / u modificateur
Effectuez un prétraitement urlcode () sur l'URL et correspondez à
Évitez d'utiliser substr_count () directement pour effectuer une analyse de fréquence des caractères multi-octets tels que chinois, japonais et coréen
La maîtrise de ces compétences peut considérablement améliorer la précision et la stabilité du programme lors du développement de sites Web multilingues, de traitement des langages naturels ou de traitement des données UTF-8 à partir de plateformes telles que Gitbox.net .