Heim  >  Artikel  >  Backend-Entwicklung  >  Problem mit der regulären PHP-Übereinstimmung durch verstümmeltes Chinesisch

Problem mit der regulären PHP-Übereinstimmung durch verstümmeltes Chinesisch

藏色散人
藏色散人Original
2020-09-30 09:38:143166Durchsuche

Die Lösung für den regulären PHP-Abgleich mit verstümmelten chinesischen Zeichen: Öffnen Sie zuerst die PHP-Codedatei und fügen Sie dann den UTF8-Modifikator zur Codedatei hinzu ',$a);".

Problem mit der regulären PHP-Übereinstimmung durch verstümmeltes Chinesisch

Empfohlen: „PHP-Video-Tutorial

Spezifisches Problem:

Die Verwendung regulärer Ausdrücke zum Abgleichen chinesischer Zeichen in PHP-Strings führt zu verstümmelten Zeichen

<?php
echo &#39;<h2>正则表达式匹配中文</h2><br>&#39;;
$a = &#39;天地不仁,以万物为刍狗&#39;;
$b = preg_replace(&#39;/万/&#39;,&#39;萬&#39;,$a);
echo $b;
echo &#39;<h2>加上方括号后替换结果出现乱码</h2><br>&#39;;
$c = &#39;天地不仁,以万物为刍狗&#39;;
$d = preg_replace(&#39;/[万]/&#39;,&#39;萬&#39;,$a);
echo $d;
 ?>

Die Ergebnisse des oben genannten Programms kann sein gefunden unter http://nyaii.com/s/test.php gesehen. Aus irgendeinem Grund erscheinen verstümmelte Zeichen, nachdem den entsprechenden chinesischen Zeichen eckige Klammern hinzugefügt wurden. In der gleichen Situation funktioniert alles einwandfrei, wenn es in Javascript ausgeführt wird.

 &#39;天地不仁&#39;.replace(/[天]/,&#39;&#39;)
 //outputs "地不仁"

Lösung:

UTF8-Modifikator hinzufügen

$d = preg_replace(&#39;/[万]/u&#39;,&#39;萬&#39;,$a);

Weitere Modifikatoren finden Sie unter

http://php.net/manual/en/reference.pcre.pattern.modifiers. php

The Es folgt der ergänzende Inhalt zur Frage im Themenkommentar

Was den Grund betrifft, warum Sie den u-Modifikator innerhalb von [] hinzufügen müssen? Streng genommen sollten Sie den u-Modifikator besser in beiden Situationen hinzufügen

Aber warum [ ] verursacht verstümmelte Zeichen? Dies muss auf der Byte-Ebene und nicht auf der Zeichenebene erklärt werden.

Zunächst wissen wir, dass PHP-Strings nicht in Unicode gespeichert sind, und dann schauen wir uns diesen Code an

<?php
$a = "万";
echo strlen($a); //3
for ($i = 0; $i < strlen($a); $i++) {
    echo dechex(ord($a[$i])) . &#39; &#39;; //e4 b8 87
}

Wir können die utf8-Hexadezimalkodierung des Wortes „zehntausend“ erhalten, die e4b887 ist

Also wenn utf8 ist nicht aktiviert. Bei Verwendung als Modifikator behandelt die Engine für reguläre Ausdrücke „zehntausend“ nicht als unabhängiges Zeichen, sondern als drei Byte fortlaufender Daten.

Das Folgende ist die Schlussfolgerung:

Wenn es kein passendes [] gibt, wird nach drei aufeinanderfolgenden Zeichen mit einem hexadezimalen Codierungswert von e4 b8 87 gesucht. Mit anderen Worten, Ihr Muster ist tatsächlich xe4xb8x87, aber wenn dieser Typ Wenn in Ihrer Zeichenfolge eine Anzahl fortlaufender Zeichen vorkommt, kann nur das Wort „zehntausend“ damit übereinstimmen, sodass nach dem Ersetzen keine verstümmelten Zeichen entstehen. Wenn Ihre Zeichenfolge jedoch möglicherweise auch 4-Byte-UTF8-codierte Zeichen wie Emoji enthält, kann dies zu Problemen führen Stellen Sie fest, dass es tatsächlich mit einem dieser drei Zeichen übereinstimmt, sodass es sich derzeit auf andere chinesische Zeichen außer Zehntausend auswirkt

Wenn Sie den UTF8-Modifikator hinzufügen Danach wird „Wan“ vom regulären Ausdruck als unabhängiges Zeichen behandelt , sodass dieses Problem nicht mehr auftritt

Da es sich bei Javascript um native Unicode-Zeichenkodierung handelt, wird jedes Zeichen als ein Zeichen behandelt und nicht in Byte-Daten aufgeteilt, sodass dieses Problem nicht auftritt

Das obige ist der detaillierte Inhalt vonProblem mit der regulären PHP-Übereinstimmung durch verstümmeltes Chinesisch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn