php regex wortgrenzeanpassung in utf-8
Habe ich folgenden php-code in einer utf-8-php-Datei:
var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));
Möchte ich die Letzte regex ersetzen, nur ganze Wörter und nicht Teile von Wörtern.
Auf meinem windows-computer, es gibt:
string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)
Auf dem webserver (linux), bekomme ich:
string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"
Damit der regex funktioniert, wie ich erwartete, auf windows aber nicht auf linux.
Also die wichtigste Frage ist, wie soll ich schreiben, dass meine regex nur match an Wortgrenzen?
Einer sekundären Fragen ist, wie kann ich lassen Sie windows wissen, dass ich möchte, um die Verwendung von utf-8 in meiner php-Anwendung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Selbst in UTF-8-Modus, standard-Klasse-Kürzel wie
\w
und\b
sind nicht Unicode-kompatibel. Sie müssen nur verwenden Sie die Unicode-Kürzeln, wie Sie funktionierte, aber Sie können machen es ein wenig weniger hässlich durch die Verwendung von lookarounds statt Wechsel:Merke auch, wie ich Links der geschweiften Klammern aus dem Unicode-Klasse Kürzel; Sie können tun, wenn der name der Klasse besteht aus einem einzelnen Buchstaben.
\w
und\b
zu funktionieren scheinen, wie erwartet, in den letzten PHP-Versionen, aber Sie sind definitiv nicht etwas, das Sie sich verlassen können, da Sie wahrscheinlich zu brechen, wenn Sie die Bereitstellung Ihrer app.Denke, das bezog sich auf die Bug #52971
und Feste in PHP 5.3.4
hier ist, was ich bis jetzt gefunden habe. Schreiben Sie die suchen und ersetzen-Muster wie dieses:
Bekomme ich das erwartete Ergebnis:
sowohl auf meinem windows-Rechner einen apache laufen und auf dem gehosteten linux-webserver mit apache.
Ich nehme an, es gibt einige besseren Weg, dies zu tun.
Außerdem möchte ich noch mal setlocale meinem windows-computer auf utf-8.
Laut dieser Kommentar, das ist ein bug in PHP. Mithilfe der
\W
statt\b
geben einen nutzen?