Frage

Ich habe den 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'));

Ich würde die letzte regex wie nur ganze Wörter zu ersetzen 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), erhalte 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 auf Windows erwartet, aber nicht auf Linux.

So ist die wichtigste Frage ist, wie soll ich schreibe meinen Regex nur an Wortgrenzen überein?

Eine sekundäre Frage ist, wie ich lassen können Fenster weiß, dass ich utf-8 in meinem PHP-Anwendung verwenden möchten.

War es hilfreich?

Lösung

Auch in UTF-8-Modus, Standardklasse Kürzel wie \w und \b sind nicht Unicode-aware. Sie müssen nur die Unicode-Kürzel verwenden, wie Sie gearbeitet, aber man kann es macht etwas weniger hässlich von lookarounds statt Abwechslungen mit:

/(?<!\pL)weiß(?!\pL)/u

Beachten Sie auch, wie verließ ich die geschweiften Klammern aus den Unicode-Klasse Kürzeln; Sie können das tun, wenn der Klassenname aus einem einzelnen Buchstaben besteht.

Andere Tipps

Hier ist das, was ich bisher gefunden. Durch Umschreiben der Such- und Ersatzmuster wie folgt aus:

$before = '(^|[^\p{L}])';
$after = '([^\p{L}]|$)';
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weißbier'));
// Test some other cases:
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß bier'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', ' weiß'));

ich das wollte Ergebnis:

string 'weißbier' (length=9)
string 'weiss' (length=5)
string 'weiss bier' (length=10)
string ' weiss' (length=6)

sowohl die Windows-Computer Apache und auf dem gehosteten Linux Webserver Apache ausgeführt wird.

Ich gehe davon aus, dass eine bessere Art und Weise, dies zu tun.

Auch ich möchte noch meinen Windows-Computer auf utf-8 bis setlocale.

Vermutung war dies im Zusammenhang mit Bug # 52971

  

PCRE-Meta-Charaktere wie \b \w nicht mit Unicode-Strings zu arbeiten.

und in PHP 5.3.4 Fest

  

PCRE-Erweiterung: Fixed bug # 52971 ( PCRE-Meta-Zeichen funktioniert nicht mit utf-8 )

.

Nach diesem Kommentar , das heißt um einen Fehler in PHP. Ist mit \W statt \b einen Nutzen geben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top