Passende Unicode-Zeichen in PCRE/PHP
Ich bin versucht, zu schreiben, einigermaßen permissiv-validator für Namen in PHP, und mein Erster Versuch besteht aus folgenden Muster:
//unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
Dies ist schließlich vergangen, um einen Anruf zu preg_match()
. Soweit ich das beurteilen kann, funktioniert dies mit Ihrem vanilla ASCII-alphabet, aber es scheint, die Reise bis auf würziger Zeichen wie ® oder 张.
Gibt es etwas falsch mit dem Muster selbst? Vielleicht erwarte ich \p{L}
mehr Arbeit als ich denke, dass es funktioniert?
Oder hat es etwas zu tun mit der Art und Weise Eingang weitergegeben werden? Ich bin mir nicht sicher, ob es relevant ist, aber ich habe sicher zu geben Sie den utf-8-Kodierung auf der Formular-Seite.
InformationsquelleAutor Jeff Lee | 2011-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das problem ist viel einfacher als das: Sie haben vergessen anzugeben, die
u
modifier. Das Unicode-Zeichen Eigenschaften sind nur in UTF-8-Modus.Ihre regex sollte:
$namePattern = '/^[\pL]$/'; $a = '张'; var_dump(preg_match($namePattern, $a)); $a = '张1'; var_dump(preg_match($namePattern, $a));
und Varianten. Es funktioniert bei mir ohne u. PHP 5.3.2-1ubuntu4.7Gibt mir
int(0)
. Ihre Datei wahrscheinlich nicht kodiert mit UTF-8.Es ist, ich habe das utf8ToUnicode routine zeigte sich in meiner Antwort um zu überprüfen, die codepoints in meiner Datei.
In diesem Fall, weiß ich nicht. Es funktioniert nicht für mich arbeiten, ohne den Modifikator, aber es funktioniert mit ihm. Da PHP nicht die richtige multibyte-support, Probleme mit der Codierung üblich.
Yep, so einfach wie das hinzufügen der
u
. Follow-up-Frage: was bedeutet dieu
zeigen, genau? Da mein Muster ohneu
noch abgestimmt ASCII, ich vermute, es erzählt die regex etwas über die Natur der input-string, statt das Muster selbst.InformationsquelleAutor NikiC
Wenn Sie Sie ersetzen möchten Unicode
old pattern
mitnew pattern
sollten Sie schreiben:Also der Schlüssel hier ist
u
modifierHinweis : Dein server
php version
sein soll, zumindestPHP 4.3.5
wie hier erwähnt php.net | Muster-Modifikatoren
Dank
AgreeOrNot
wer mir diesen Schlüssel hier preg_replace ganzes Wort in ArabischIch versuchte es und es funktionierte in localhost, aber wenn ich versuchen, es in der remote-server hat es nicht funktioniert, dann habe ich festgestellt, dass php.net starten
u
Modifikator in PHP 4.3.5. Ich upgrade der php-version und es funktioniertIst es wichtig zu wissen, dass diese Methode ist sehr hilfreich für Arabische Benutzer (عربي), weil - wie ich glaube - unicode ist die beste Kodieren für die Arabische Sprache, und Ersatz wird nicht funktionieren, wenn Sie nicht die
u
modifier, siehe Nächstes Beispiel sollte es mit Sie$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);
InformationsquelleAutor usama sulaiman
Erste von allen, Ihr Leben wäre viel einfacher, wenn Sie verwenden würden, eine einzige Apostrophe anstelle von doppelten Anführungszeichen beim schreiben diese -- Sie brauchen nur ein backslash. Zweitens, die Kombination von Marken
\pM
sollte auch enthalten sein. Wenn Ihr einen Charakter nicht übereinstimmen bitte die Unicode-code-point und dann können Sie http://www.fileformat.info/info/unicode/ um herauszufinden, wo es ist. Ich fand http://hsivonen.iki.fi/php-utf8/ ein unschätzbares Werkzeug, wenn beim Debuggen mit UTF-8 Eigenschaften (vergessen Sie nicht zu konvertieren hex, bevor Sie versuchen zu suchen:array_map('dechex', utf8ToUnicode($text))
).Beispielsweise Ă entpuppt sich http://www.fileformat.info/info/unicode/char/0102/index.htm und in Lu und so L sollte es passen und es passt für mich. Der andere Charakter ist http://www.fileformat.info/info/unicode/char/5f20/index.htm und ist auch isLetter und in der Tat Spiele für mich. Hast du den Unicode-Zeichensatz-Tabellen kompiliert?
InformationsquelleAutor chx