Domanda

grazie per le risposte a:

"espressioni regolari per rilevare numeri scritti come parole":

espressioni regolari per rilevare numeri scritti come parole

Ora ho questo lavoro, però ho lo stesso requisito, ma i numeri come parole sono in arabo (o qualsiasi altro UTF-8) e non l'inglese, così:

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

non funziona - Googled e sembra che ci sia qualche problema con bel preg_match e stringa UTF-8, ma non ho potuto ottenere qualsiasi dei suggerimenti trovato a lavorare. Qualsiasi aiuto molto apprezzato.

È stato utile?

Soluzione

Si noti che \b potrebbe non funzionare come previsto. \b specifica un parola confine, ma quello che è considerato un carattere di parola da PCRE dipende da ciò che locale lo script è in esecuzione in (date un'occhiata verso il fondo della PCRE le sequenze di escape pagina di manuale):

  

Un carattere "parola" è qualsiasi lettera o cifra o il carattere di sottolineatura, che è, qualsiasi carattere che può essere parte di una "parola" Perl. La definizione di lettere e numeri è controllata da tabelle dei caratteri PCRE, che possono variare in locale-specifico corrispondente sta avvenendo. Ad esempio, nel locale "fr" (francese), alcuni codici di carattere maggiore di 128 sono utilizzati per le lettere accentate, e questi sono accompagnati da \ w.

Si potrebbe anche voler leggere Handling UTF-8 con PHP ( la sezione PCRE in particolare).

Al contrario, si potrebbe usare un Lookaround in combinazione con una proprietà Unicode emulare un limite di parola: (?<=\P{L}). Questo afferma che il carattere precedente è non un unicode "lettera".

Quindi, tutti insieme sarebbe simile:

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

Altri suggerimenti

convertire sia modello e $str a windows-1256, non l'abbinamento, poi convertire gli elementi $matches posteriore (se necessario), questa è la soluzione sono venuto a dopo aver sofferto per un po '.

$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;

Ecco un esempio di prova per verificare se la conversione Unicode sta permettendo lettere arabe corrispondere 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 />';
    }
}

durante l'esecuzione, il risultato sarà:

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

ho tolto un po 'del modello per verificare se il controllo di pianura contro opere arabe, che sembra funzionare.

È possibile utilizzare il modello u modificatore di utilizzare qualsiasi linguaggio supportato UTF-8.

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

Risorse:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top