谢谢你的回答:

"经常表达的检测数字写成的话":

经常表达的检测数字写成的话

我现在有这样的工作,但是我也有同样要求,但该数字词在阿拉伯语(或者任何其他UTF-8),并不是英语,所以:

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

没工作-我已经google搜索和似乎有相当多的问题preg_match和UTF-8串但我不能让任何建议,找到工作。任何帮助。

有帮助吗?

解决方案

请注意,当你想到\b可能无法正常工作。 \b指定一个字边界,但什么被认为是一个单词字符由PCRE取决于什么语言环境的脚本运行(迈出的 PCRE底部的样子转义序列的手册页):

  

一个“字”的字符是任何字母或数字或下划线字符,也就是,它可以是一个Perl“字”的一部分的任何字符。字母和数字的定义由PCRE字符表控制,如果特定于语言环境的匹配正在发生可能会有所不同。例如,在“FR”(法国)区域,一些字符码大于128用于重音字母,而这些是由匹配\瓦特

您也可能需要阅读处理UTF-8 PHP (特别是关于PCRE部分)。

相反,你可以使用一个与Unicode字符属性到一起环视模拟一个单词边界:(?<=\P{L})。这个断言前一个字符是的一个unicode “字母”。

所以大家聚在一起会是什么样子:

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

其他提示

这两个模式,$str转换为windows-1256,做匹配,然后将其转换$matches项背(如果需要的话),这是我的痛苦了一段时间后,来到了解决方案。

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

下面是一个试验例,以检查是否Unicode转换是允许阿拉伯字母匹配的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 />';
    }
}

上执行时,它会输出:

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

我删除一些图案的检查,如果普通检查针对阿拉伯作品,这似乎是工作。

你可以使用的模式的修改 u 使用UTF-8支持的任何语言。

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

资源:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top