正则表达式,用于检测写为单词的数字 - UTF-8输入

时间:2010-09-02 18:35:26

标签: php regex utf-8 preg-match arabic

感谢您的答案:

“正则表达式,用于检测写为单词的数字”:

regular expression to detect numbers written as words

我现在有这个工作,但我有相同的要求,但数字为单词是阿拉伯语(或任何其他UTF-8)而不是英语,所以:

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

不起作用 - 我用谷歌搜索,似乎有很多问题与preg_match和UTF-8字符串,但我无法得到任何建议的工作。任何帮助非常感谢。

3 个答案:

答案 0 :(得分:2)

请注意\b可能无法正常工作。 \b指定word boundary,但PCRE认为的单词字符取决于脚本运行的区域设置(请查看PCRE escape sequences手册页的底部):< / p>

  

“单词”字符是任何字母或数字或下划线字符,即任何可以成为Perl“单词”一部分的字符。字母和数字的定义由PCRE的字符表控制,如果发生特定于语言环境的匹配,则可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于128的字符代码用于重音字母,并且这些字符代码由\ w匹配。

您可能还想阅读Handling UTF-8 with PHP(特别是关于PCRE的部分)。

相反,您可以将lookaround与Unicode字符属性结合使用来模拟单词边界:(?<=\P{L})。这断言前一个字符是一个unicode“字母”。

所以这一切看起来像是:

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

答案 1 :(得分:0)

将模式和$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 />';
    }
}

执行时,它将输出:

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

我删除了一些模式以检查对阿拉伯语的普通检查是否有效,这似乎有效。

答案 2 :(得分:0)

您可以使用模式修饰符u来使用任何支持UTF-8的语言。

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

资源: