Frage

Danke für die Antworten an:

„regulärer Ausdruck Zahlen zu erfassen, wie Worte geschrieben“:

regulärer Ausdruck Zahlen zu erfassen, wie Worte geschrieben

ich diese Arbeit jetzt habe, aber ich habe die gleiche Forderung, aber die Zahlen als Worte in Arabisch sind (oder jedes anderes UTF-8) und nicht Englisch, so:

if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/", $str, $matches) > 0) 
   return true;

funktioniert nicht - ich habe gegoogelt und es scheint durchaus ein paar Probleme mit preg_match und UTF-8-String zu sein, aber ich konnte nicht eine der Anregungen zur Arbeit gefunden. Jede Hilfe sehr geschätzt.

War es hilfreich?

Lösung

Beachten Sie, dass \b nicht arbeiten können, wie Sie es erwarten. \b gibt an einer Wortgrenze , aber was für ein Wortzeichen von PCRE betrachtet wird, hängt davon ab, was locale das Skript in läuft (werfen Sie einen Blick in Richtung der Unterseite des PCRE Escape-Sequenzen Handbuch Seite):

  

Ein „Wort“ -Zeichen ist ein beliebiger Buchstabe oder Ziffer oder der Unterstrich, das heißt, jedes Zeichen, das Teil eines Perl „Wortes“ sein kann. Die Definition von Buchstaben und Ziffern wird durch PCRE der Zeichentabellen gesteuert und kann variieren, wenn länderspezifische Anpassungsstattfindet. Zum Beispiel in der „fr“ (Französisch) locale einige Zeichencodes größer als 128 sind für akzentuierten Buchstaben verwendet, und diese werden durch abgestimmte \ w.

Sie können auch lesen wollen Umgang mit UTF-8 mit PHP ( der Abschnitt über PCRE im besonderen).

Stattdessen könnten Sie verwenden Lookarounds in Verbindung mit einer Unicode-Zeichen-Eigenschaft auf emulieren eine Wortgrenze: (?<=\P{L}). Dies behauptet, dass das vorherige Zeichen ist nicht ein Unicode "Buchstaben".

Also alles zusammen würde es wie folgt aussehen:

/(?<=\P{L})(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\s*?){4}/

Andere Tipps

beiden Muster und $str zu windows-1256 konvertieren, den passenden tut, dann $matches Stück zurück (falls erforderlich) umwandeln, das ist die Lösung, die ich auf einige Zeit nach dem Leiden kam.

$pattern="/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/";
$pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern);
$str_windows1265 = iconv('utf-8', 'windows-1256', $str);
if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) 
   return true;

Hier ist ein Testbeispiel zu überprüfen, ob Unicode-Konvertierung arabische Buchstaben wird ermöglicht entsprechen in preg_match:

<?php
$pattern="/(واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)/";
$pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern);


$test_cases=array(
    'لدي أربعة أولاد',
    'قفز الثعلب فوق الشجرة',
    'عندي خمسة أرانب',
);
foreach ($test_cases as $str) {
    $str_windows1265 = iconv('utf-8', 'windows-1256', $str);

    if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) {
        echo $str, '<br />';
    }
}

bei der Ausführung, wird es ausgegeben:

لدي أربعة أولاد
لدي خمسة أرانب

Ich entfernte einen Teil des Musters zu überprüfen, ob die einfache Prüfung gegen arabische Werke, die zu funktionieren scheint.

Sie können das Muster Modifikator u verwenden alle UTF-8 unterstützt die Sprache zu verwenden.

if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/u", $str, $matches) > 0) 

Ressourcen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top