espressioni regolari per rilevare numeri scritti come parole - UTF-8 di ingresso
-
26-09-2019 - |
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.
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: