Passende Unicode-Buchstabenzeichen in PCRE/PHP

Lesezeit: 4 Minuten

Passende Unicode Buchstabenzeichen in PCREPHP
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';

  • 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


Passende Unicode Buchstabenzeichen in PCREPHP
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);

Passende Unicode Buchstabenzeichen in PCREPHP
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)  ?>

989810cookie-checkPassende Unicode-Buchstabenzeichen in PCRE/PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy