Ich versuche, einen einigermaßen freizügigen Validator für Namen in PHP zu schreiben, und mein erster Versuch besteht aus dem folgenden Muster:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
Dies wird schließlich an einen Aufruf weitergegeben preg_match(). Soweit ich das beurteilen kann, funktioniert dies mit Ihrem Vanille-ASCII-Alphabet, scheint aber auf schärfere Zeichen wie Ă oder 张 zu stolpern.
Stimmt etwas mit dem Muster selbst nicht? Vielleicht erwarte ich \p{L} mehr arbeiten, als ich denke?
Oder hat es etwas mit der Art und Weise zu tun, wie Eingaben übergeben werden? Ich bin mir nicht sicher, ob es relevant ist, aber ich habe darauf geachtet, eine UTF8-Codierung auf der Formularseite anzugeben.
Ich denke, das Problem ist viel einfacher als das: Sie haben vergessen, das anzugeben uModifikator. Die Unicode-Zeicheneigenschaften sind nur im UTF-8-Modus verfügbar.
Ihre Regex sollte sein:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
Seltsam. Versuchen $namePattern = '/^[\pL]$/'; $a = '张'; var_dump(preg_match($namePattern, $a)); $a = '张1'; var_dump(preg_match($namePattern, $a)); und Varianten. Bei mir funktioniert es auch ohne dich. PHP 5.3.2-1ubuntu4.7
– chx
13. Februar 2011 um 9:42 Uhr
@chx: Gibt mir int(0). Ihre Datei ist wahrscheinlich nicht mit UTF-8 codiert.
– Nikic
13. Februar 2011 um 9:47 Uhr
Ich habe die in meiner Antwort gezeigte utf8ToUnicode-Routine verwendet, um die Codepunkte in meiner Datei zu überprüfen.
– chx
13. Februar 2011 um 9:59 Uhr
@chx: In diesem Fall weiß ich es nicht. Ohne Modifikator funktioniert es bei mir nicht, aber damit. Da PHP keine ordnungsgemäße Multibyte-Unterstützung bietet, treten häufig Probleme mit der Codierung auf.
– Nikic
13. Februar 2011 um 10:05 Uhr
Ja, so einfach wie das Hinzufügen der u. Folgefrage: Was bedeutet die u genau angeben? Da mein Muster ohne die u immer noch übereinstimmendes ASCII, ich vermute, es sagt der Regex eher etwas über die Art der Eingabezeichenfolge als über das Muster selbst.
– Jeff Lee
13. Februar 2011 um 18:43 Uhr
Usama Sulaiman
Wenn Sie Unicode ersetzen möchten old pattern mit new pattern du solltest schreiben:
u (PCRE_UTF8) Dieser Modifikator schaltet zusätzliche Funktionalität von PCRE ein, die nicht mit Perl kompatibel ist. Musterzeichenfolgen werden als UTF-8 behandelt. Dieser Modifikator ist ab PHP 4.1.0 unter Unix und ab PHP 4.2.3 unter win32 verfügbar. Die UTF-8-Gültigkeit des Musters wird seit PHP 4.3.5 überprüft.
Danke AgreeOrNot Wer gibt mir diesen Schlüssel hier? preg_replace passt ganzes Wort auf Arabisch an
Ich habe es versucht und es hat in localhost funktioniert, aber als ich es auf dem Remote-Server versucht habe, hat es nicht funktioniert, dann habe ich festgestellt, dass php.net start use ist u Modifikator in PHP 4.3.5. , ich aktualisiere die PHP-Version und es funktioniert
Es ist wichtig zu wissen, dass diese Methode für arabische Benutzer (عربي) sehr hilfreich ist, da Unicode meiner Meinung nach die beste Codierung für arabische Sprache ist und die Ersetzung nicht funktioniert, wenn Sie die nicht verwenden u Modifikator, siehe nächstes Beispiel, es sollte mit Ihnen funktionieren
Zunächst einmal wäre Ihr Leben viel einfacher, wenn Sie beim Schreiben einfache Apostrophe anstelle von doppelten Anführungszeichen verwenden würden – Sie benötigen nur einen umgekehrten Schrägstrich. Zweitens, das Kombinieren von Marken \pM sollten ebenfalls enthalten sein. Wenn Sie ein Zeichen finden, das nicht übereinstimmt, finden Sie seinen Unicode-Codepunkt heraus und können Sie es dann verwenden http://www.fileformat.info/info/unicode/ um herauszufinden, wo es ist. ich fand http://hsivonen.iki.fi/php-utf8/ ein unschätzbares Werkzeug beim Debuggen mit UTF-8-Eigenschaften (vergessen Sie nicht, in Hex zu konvertieren, bevor Sie versuchen, nachzuschlagen: array_map('dechex', utf8ToUnicode($text))).
Alle anderen, die hier suchen und dies nicht zum Laufen bringen, bitte beachten /u erzeugt kein konsistentes Ergebnis mit Unicode-Skripten über verschiedene PHP-Versionen hinweg.