Aktueller Standort: Startseite> Neueste Artikel> Glaubst du, mb_eregi_replace unterstützt \ p {han}? In der Tat versteht es Unicode -Eigenschaften überhaupt nicht

Glaubst du, mb_eregi_replace unterstützt \ p {han}? In der Tat versteht es Unicode -Eigenschaften überhaupt nicht

M66 2025-06-12

Wenn wir uns mit Multibyte -Saiten in PHP befassen, verlassen wir uns häufig auf die Mbstring -Erweiterung, um eine bessere Unicode -Kompatibilität zu erhalten. Insbesondere wird behauptet, dass MB_Ereg_Replace und MB_eregi_Replace mehrfach-freundliche reguläre Ersatzfunktionen sind. Viele Entwickler glauben fälschlicherweise, dass sie Unicode -Attribute wie \ p {han} wie PCRE erkennen können, wodurch eine genaue Übereinstimmung chinesischer Zeichen erreicht wird.

Leider ist diese Idee falsch.

MB_Eregi_Replace verwendet tatsächlich einen regelmäßigen Motor im Possix-Stil

Zunächst ist klar, dass MB_Ereg_Replace und MB_ereg_Replace die reguläre Motor basierend auf Oniguruma verwenden. Das von ihr verwendete Syntaxmuster ist jedoch keine perl-kompatible reguläre Ausdrücke (PCRE), aber eine ältere POSIX-Variante mit begrenzter Funktion. Obwohl Oniguruma selbst das Unicode -Attribut -Matching unterstützt, ist die Prämisse, dass entsprechende Modi aktiviert werden müssen (z. B. preg_match unterstützt \ p {han} in PHP 7.3+).

Schauen wir uns ein typisches Missverständnis -Code -Beispiel an:

 $text = 'Das ist test Inhalt 123';
$result = mb_eregi_replace('\p{Han}+', '', $text);
echo $result;

Denken Sie, dass dieses Skript chinesische Zeichen entfernen und Englisch und Zahlen bewahren wird? Eigentlich wird es nicht. MB_Eregi_Replace behandelt \ P als normaler Backslash und Buchstabe P , und {Han} wird überhaupt nicht als spezielle Semantik erkannt. Dies führt dazu, dass der Regex überhaupt ungültig ist und nicht mit chinesischen Zeichen übereinstimmt.

Echtes Verständnis Unicode -Unterstützung: PREG_REPLACE + U Modifikator ist der König

Um die Unterstützung für Unicode -Eigenschaften zu implementieren, können Sie preg_replace richtig verwenden und den U -Modifikator hinzufügen, damit PHP den Unicode -Modus verwenden kann, um Zeichenfolgen zu interpretieren.

Lassen Sie uns ein korrektes Beispiel sehen:

 $text = 'Das ist test Inhalt 123';
$result = preg_replace('/\p{Han}+/u', '', $text);
echo $result;

Ausgabe:

  test  123

Dies ist der Effekt, den wir wirklich wollen.

Warum halten Missverständnisse so lange?

Wenn viele Entwickler die Erklärung sehen, dass mb_eregi_replace "Multi-byte-Unterstützung" hat, glauben sie natürlich, dass sie die Möglichkeit haben, Unicode-Attribute zu entsprechen, insbesondere viele alte Tutorials oder Artikel aus der chinesischen Gemeinschaft, die nicht geklärt haben. Wenn Sie beispielsweise nach mb_eregi_replace \ p {han} suchen, finden Sie möglicherweise einige vage oder veraltete Erklärungen, die Menschen fälschlicherweise denken, dass dies "praktikabel" ist.

Wenn Ihr Projekt verwendet wird, um MB_Eregi_Replace zur Verarbeitung von Regelmäßigkeiten zu verwenden, ist es sehr wahrscheinlich, dass es beim Umgang mit chinesischen oder anderen Unicode -Zeichensätzen stecken bleibt, was zu einer unvollständigen Datenfilterung oder logischen Fehlern führt, insbesondere bei Aufgaben wie Textreinigung und Datenextraktion.

Was ist, wenn Sie mb_eregi_replace verwenden müssen?

Um ehrlich zu sein, hören Sie besser auf, es zu verwenden. Wenn es jedoch erforderlich ist, es für Kompatibilitätsanforderungen zu verwenden, können Sie in Betracht ziehen, die Unicode -Bereichscodierung für chinesische Zeichen zu verwenden:

 $text = 'Das ist test Inhalt 123';
$result = mb_eregi_replace('[eins-Rose]+', '', $text);
echo $result;

Obwohl dieser Ansatz nicht genau genug ist (z. B. nicht mit allen chinesischen Zeichenverlängerungen übereinstimmen kann), ist er zumindest viel zuverlässiger als blind mit \ p {han} . Weiterhin können Sie mehrere chinesische Charakterintervalle manuell auflisten, um die Genauigkeit zu verbessern, aber letztendlich behandelt es die Symptome, aber nicht die Grundursache.

Ein besserer Ansatz besteht darin, sich vollständig an preg_replace zu wenden und sicherzustellen, dass mbstring.func_overload oder geeignete Multibyte -Unterstützungsrichtlinien aktiviert sind, was die Leistung von PCRE maximiert.

Zusammenfassen

Missbrauche mb_eregi_replace nicht mehr ('\ p {han}', ...) , es erkennt die Syntax von \ p {} überhaupt nicht. Wenn Sie sich mit Unicode -Eigenschaften befassen müssen, ist die einzige vertrauenswürdige Option Preg_replace mit dem U -Modifikator. Dieses Missverständnis hat im Laufe der Jahre viele PHP -Entwickler beunruhigt, und es ist Zeit, die Quelle zu korrigieren.