2011-01-07 19 views
3

Hallo zusammen Ich habe diesen Code, der für 5 oder mehr aufeinander folgende Zahlen überprüft:regulärer Ausdruck aufeinanderfolgende Zahlen zu erkennen - nicht für nicht-englischen Eingang eines

if (preg_match("/\d{5}/", $input, $matches) > 0) 
return true; 

Es funktioniert für die Eingabe in Ordnung, das Englisch ist, aber es ist stürzt ab, wenn die Eingabezeichenfolge arabische/Multibyte-Zeichen enthält - es gibt manchmal true zurück, auch wenn im Eingabetext keine Zahlen enthalten sind.

Irgendwelche Ideen?

+1

Gibt es eine Chance, dass Sie Ihren fehlerhaften '$ input' einfügen könnten? Ich bin sehr daran interessiert, diesen Fehler zu sehen. –

Antwort

0

Sie müssen sich richtig einrichten, wenn Sie mit UTF-8 umgehen wollen.

Sie können php mit dem aktivierten PCRE UTF-8-Flag rekompilieren.

Oder Sie können die Sequenz (*UTC8) am Anfang Ihrer Regex hinzufügen. Zum Beispiel:

/(*UTF8)[[:alnum:]]/, Eingang é, Ausgabe TRUE

/[[:alnum:]]/, Eingang é, Ausgabe FALSE.

Auschecken http://www.pcre.org/pcre.txt, die viele Informationen über UTF-8-Unterstützung in der PCRE-Bibliothek enthält.

+0

Haftungsausschluss: Dies war reine Forschung; Ich habe es selbst nicht ausprobiert. –

+0

Hallo dort, ich benutze UTF8 normalerweise sogar für Englisch - das Problem ist nicht mit UTF8, es ist mehr mit Multibyte-Zeichen, ich habe die Beschreibung aktualisiert –

+0

@SherifBuzz: Wie ich es verstehe, das ist, was die PCRE-Flag ermöglicht Unterstützung für. Multibyte ist in UTF-8 etwas inhärent. [Einzelzeichen] ASCII wird ansonsten angenommen. Darf ich fragen, woher Sie wissen, dass Ihre englischen Strings Multibyte sind? –

6

Sie scheinen mit PHP zu arbeiten.

tun:

if (preg_match("/\d{5}/u", $input, $matches) > 0) 
return true; 

Notiere die 'u' Modifikator am Ende des Ausdrucks. Es weist preg_ * an, den Unicode-Modus für die Übereinstimmung zu verwenden.

0

Selbst im UTF-8-Modus stimmen vordefinierte Zeichenklassen wie \d und [[:digit:]] nur mit ASCII-Zeichen überein. Passend möglicherweise Nicht-ASCII-Ziffern müssen Sie die entsprechende Unicode-Eigenschaft verwenden, \p{Nd}:

$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5"; 
preg_match_all('~\p{Nd}{5}~u', $s, $matches); 

See it in action on ideone.com

Wenn Sie bestimmte Zeichen oder Bereiche entsprechen müssen, können Sie entweder den \x{HHHH} Escape-Sequenz mit der entsprechende Codepunkte:

preg_match_all('~[\x{0661}-\x{0665}]{5}~u', $s, $matches); 

... oder verwenden Sie die \xHH Form zur Eingabe ihrer UTF-8 codiert Bytefolgen:

preg_match_all("~[\xD9\xA1-\xD9\xA5]{5}~u", $s, $matches); 

Beachten Sie, dass ich für dieses letzte Beispiel in doppelte Anführungszeichen wechselte. Die Formulare \p{} und \x{} wurden übergeben, um vom Regex-Compiler verarbeitet zu werden, aber dieses Mal möchten wir, dass der Compiler PHP die Escape-Sequenzen erweitert. In Strings mit einfachen Anführungszeichen passiert das nicht.