Pergunta

obrigado pelas respostas para:

"expressão regular para detectar números escritos como palavras":

expressão regular para detectar números escritos como palavras

Agora tenho isso funcionando, porém tenho o mesmo requisito, mas os números das palavras estão em árabe (ou qualquer outro UTF-8) e não em inglês, então:

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

Não funciona - pesquisei no Google e parece haver alguns problemas com preg_match e string UTF-8, mas não consegui fazer com que nenhuma das sugestões funcionasse.Qualquer ajuda muito apreciada.

Foi útil?

Solução

Observe que \b pode não estar funcionando como você espera. \b especifica um limite da palavra, mas o que é considerado um caractere de palavra pelo PCRE depende de qual localidade o script está sendo executado (dê uma olhada na parte inferior do Sequências de escape PCRE página de manual):

Um caractere de "palavra" é qualquer letra ou dígito ou sublinhado, ou seja, qualquer caractere que possa fazer parte de uma "palavra" Perl.A definição de letras e dígitos é controlada pelas tabelas de caracteres do PCRE e pode variar se ocorrer uma correspondência específica de localidade.Por exemplo, no código de idioma "fr" (francês), alguns códigos de caracteres maiores que 128 são usados ​​para letras acentuadas e são correspondidos por \w.

Você também pode querer ler Manipulando UTF-8 com PHP (a seção sobre PCRE em particular).

Em vez disso, você poderia usar um olhar em volta em conjunto com uma propriedade de caractere Unicode para emular um limite de palavra: (?<=\P{L}).Isso afirma que o caractere anterior é não uma "letra" unicode.

Então, todos juntos, ficaria assim:

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

Outras dicas

converter o padrão e $str para windows-1256, faça a correspondência e depois converta $matches itens de volta (se necessário), esta é a solução que cheguei depois de sofrer por algum tempo.

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

Aqui está um exemplo de teste para verificar se a conversão do Unicode está permitindo que as letras árabes correspondam em 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 />';
    }
}

Ao executar, ele será lançado:

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

Eu removi parte do padrão para verificar se a verificação simples contra obras árabes, que parece estar funcionando.

Você pode usar o modificador de padrão u Para usar qualquer idioma suportado por UTF-8.

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

Recursos :

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top