Question

Merci pour les réponses à:

"expression régulière pour détecter des nombres écrits sous forme de mots":

expression régulière pour détecter des nombres écrits sous forme de mots

J'ai maintenant ce travail, mais j'ai la même exigence, mais les chiffres que les mots sont en arabe (ou tout autre UTF-8) et non l'anglais, donc:

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

ne fonctionne pas - je l'ai googlé et il semble y avoir pas mal de problèmes avec preg_match et chaîne UTF-8, mais je ne pouvais pas obtenir l'une des suggestions trouvées au travail. Toute aide très appréciée.

Était-ce utile?

La solution

Notez que \b pourrait ne pas fonctionner comme prévu. \b spécifie href="http://www.regular-expressions.info/wordboundaries.html" rel="nofollow noreferrer"> mot frontière , mais ce qui est considéré comme un caractère de mot par PCRE dépend de ce que locale le script est en cours d'exécution dans (jetez un oeil vers le bas de la PCRE les séquences d'échappement page de manuel):

  

Un « mot » caractère est une lettre ou un chiffre ou le caractère de soulignement, qui est un caractère qui peut faire partie d'un Perl « mot ». La définition des lettres et des chiffres est contrôlé par les tables de caractères de PCRE, et peut varier suivant correspondance spécifique à la localisation est en cours. Par exemple, dans le « fr » (français) locale, certains codes de caractères supérieurs à 128 pour les caractères accentués, et ceux-ci sont mis en correspondance par \ w.

Vous pouvez également lire Manipulation UTF-8 avec PHP ( la section sur PCRE en particulier).

Au lieu de cela, vous pouvez utiliser un lookaround en conjonction avec une propriété de caractère Unicode émuler une limite de mot: (?<=\P{L}). Cela affirme que le caractère précédent est pas unicode "lettre".

Alors tous ensemble, il ressemblerait à ceci:

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

Autres conseils

convertir à la fois modèle et $str à windows-1256, la mise en correspondance ne puis convertir les éléments de $matches retour (si nécessaire), c'est la solution que je suis venu à après avoir souffert pendant un certain temps.

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

Voici un exemple de test pour vérifier si la conversion unicode permet à lettres arabes correspondent à 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 />';
    }
}

lors de l'exécution, il affichera:

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

Je retire une partie du motif pour vérifier si la vérification simple contre des ouvrages arabes, qui semble fonctionner.

Vous pouvez utiliser le modificateur de modèle u d'utiliser une langue prise en charge UTF-8.

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

Ressources:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top