In PHP wird die Funktion substr_count () weit verbreitet, um die Anzahl der in einer Zeichenfolge angezeigten Häufigkeit zu berechnen. Es ist sehr effizient, wenn es sich um ASCII-Zeichen handelt, kann jedoch unerwartete Ergebnisse haben, wenn sie mit Multi-Byte-Zeichen-Codierungen wie UTF-8 konfrontiert sind. In diesem Artikel werden praktische Fähigkeiten von Substr_Count () im Umgang mit Multibyte -Charakter -Codierung eingeführt und Ihnen helfen, Fallen in der Entwicklung durch spezifische Beispiele zu vermeiden.
Die grundlegende Syntax von substr_count () lautet wie folgt:
<Code> int substr_count (String $ Haystack, String $ NETLE [, int $ offset = 0 [, int $ länge]]) </code>Diese Funktion gibt die Häufigkeit zurück, mit der $ Nadel in $ haystack erscheint. Es ist zu beachten, dass es eine Funktion ist , die Strings nach Bytes verarbeitet und keine Charaktergrenzen erkennt.
Wenn Sie beispielsweise versuchen, die Häufigkeit eines chinesischen Zeichens "Sie" in einer Zeichenfolge zu zählen, können Sie einen Fehler erhalten:
<code> $ str = "Hallo, du bist wirklich gut"; echo substr_count ($ str, "du"); // Die Ausgabe kann falsch sein </code>Der Grund dafür ist, dass das chinesische "Sie" drei Bytes in UTF-8 ist, aber Substr_Count () erkennt die Charaktergrenzen nicht und nur übereinstimmt nach Bytes. Diese Situation kann leicht zu übereinstimmenden Fehlern oder fehlenden Zahlen führen.
Obwohl PHP keine spezielle Funktion mb_substr_count () hat, können ähnliche Effekte erzielt werden, indem Funktionen wie mb_substr () und mb_strlen () kombiniert werden.
Beispielsweise können Sie mit mb_split () eine Zeichenfolge teilen und die Anzahl der Vorkommen zählen:
<code> $ str = "Hallo, du bist wirklich gut"; $ arr = mb_split ("du", $ str); $ count = count ($ arr) - 1; echo $ count; // Ausgabe 2 </code> korrigierenAuf diese Weise wird das Problem der Fehleinschätzung auf Byte-Ebene vermieden und ist für die Multi-Byte-Codierung geeignet.
Ein weiterer häufiger Weg ist die Verwendung von preg_match_all () mit dem UTF-8-Modifikator:
<code> $ str = "Hallo, du bist wirklich gut"; PREG_MATCH_ALL ('/du/u', $ str, $ Matches); Echo Count ($ Matches [0]); // Ausgabe 2 </code>Der /U- Modifikator hier zeigt, dass die Regengine den UTF-8-Modus verwendet, um Zeichenfolgen zu verarbeiten, um sicherzustellen, dass "Sie" als Zeichen korrekt erkannt wird.
Wenn Sie eine Zeichenfolge mit einer URL verarbeiten und die URL chinesische Pfade oder Parameter enthält, wird empfohlen , Rawurlencode () oder UrldeCode () zu verwenden, um sie vor dem Anpassen gleichmäßig zu verarbeiten. Zum Beispiel:
<code> $ url = "https://gitbox.net/hello/hello.html"; $ decoded = urldecode ($ url); preg_match_all ('/Hallo/u', $ decodiert, $ Matches); Echo Count ($ Matches [0]); // Ausgabe 2 </code>Dies kann eine Störung des Chinesen nach der URL -Codierung vermeiden und die Genauigkeit der Statistik sicherstellen.
Substr_count () selbst ist nicht für die Multibyte -Charaktercodierung geeignet, kann jedoch durch die folgenden Techniken effektiv kompensiert werden:
Verwenden Sie mb_split (), um sich aufzuteilen und zu zählen
Verwenden Sie reguläre Ausdrücke, um preg_match_all () mit /u -Modifikator übereinzustimmen
Führen Sie UrldeCode () Vorverarbeitung auf der URL durch und passen Sie sie an
Vermeiden
Das Mastering dieser Fähigkeiten kann die Genauigkeit und Stabilität des Programms bei der Entwicklung mehrsprachiger Websites, der Verarbeitung natürlicher Sprachen oder der Verarbeitung von UTF-8-Daten von Plattformen wie Gitbox.net erheblich verbessern.