Pregunta

gracias por las respuestas a:

"expresión regular para detectar números escritos como las palabras":

expresión regular para detectar números escritos como palabras

Ahora tengo este trabajo, sin embargo, tengo el mismo requisito, pero los números son palabras en árabe (o cualquier otra UTF-8) y no Inglés, por lo que:

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

no funciona - He buscado en Google y parece que hay bastantes problemas con preg_match y UTF-8 cadena, pero no pude conseguir ninguna de las sugerencias que se encuentran al trabajo. Cualquier ayuda muy apreciada.

¿Fue útil?

Solución

Tenga en cuenta que \b puede no estar funcionando como se espera. \b especifica un palabra límite, pero lo que se considera un carácter de palabra por PCRE depende de lo locale la secuencia de comandos se ejecuta en (echar un vistazo hacia la parte inferior de la PCRE secuencias de escape página del manual):

  

Un personaje "palabra" es cualquier letra o dígito o el carácter de subrayado, es decir, cualquier carácter que puede ser parte de una "palabra" Perl. La definición de letras y dígitos se controla mediante tablas de caracteres de PCRE, y puede variar si la configuración regional específica juego está teniendo lugar. Por ejemplo, en la configuración regional "fr" (francés), algunos códigos de caracteres superior a 128 se utilizan para las letras acentuadas, y éstas se corresponden con \ w.

También puede ser que desee leer Manejo de UTF-8 con PHP ( la sección sobre PCRE en particular).

En su lugar, se podría utilizar un lookaround en conjunción con una propiedad de carácter Unicode para emular un límite de palabra: (?<=\P{L}). Este afirma que el carácter anterior es no a Unicode "letra".

Así que todos juntos se vería así:

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

Otros consejos

convertir tanto el patrón y $str a windows-1256, no el juego, a continuación, convertir elementos $matches posterior (si es necesario), esta es la solución que vine a después de sufrir durante algún tiempo.

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

Este es un ejemplo de prueba para comprobar si la conversión Unicode está permitiendo que coincida con las letras árabes en 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 />';
    }
}

cuando se ejecuta, que sería:

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

Me quita algo del patrón para comprobar si el cheque normal contra las obras árabes, que parece estar funcionando.

Puede utilizar el modificador u patrón a utilizar cualquier lenguaje soportado UTF-8.

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

Recursos:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top