
Jeff Lee
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 u
Modifikator. Die Unicode-Zeicheneigenschaften sind nur im UTF-8-Modus verfügbar.
Ihre Regex sollte sein:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';

Usama Sulaiman
Wenn Sie Unicode ersetzen möchten old pattern
mit new pattern
du solltest schreiben:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
Der Schlüssel hier ist also u
Modifikator
Notiz : Ihr Server php version
sollte zumindest sein PHP 4.3.5
wie hier erwähnt php.net | Mustermodifikatoren
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
$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);

chx
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))
).
Zum Beispiel stellt sich heraus, dass Ă ist http://www.fileformat.info/info/unicode/char/0102/index.htm und in Lu zu sein und so sollte L dazu passen und es passt zu mir. Der andere Charakter ist http://www.fileformat.info/info/unicode/char/5f20/index.htm und ist auch isLetter und passt tatsächlich zu mir. Haben Sie die Unicode-Zeichentabellen einkompiliert?
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.
Siehe Beispiel: https://3v4l.org/4hB9e
Verwandt: Inkonsistentes Regex-Ergebnis für thailändische Zeichen in verschiedenen PHP-Versionen
<?php preg_match('/[a-zığüşöç]/u',$title) ?>
9898100cookie-checkPassende Unicode-Buchstabenzeichen in PCRE/PHPyes