2

感谢您的回答:

“检测写成单词的数字的正则表达式”:

正则表达式来检测写成单词的数字

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

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

不起作用 - 我用谷歌搜索过,似乎 preg_match 和 UTF-8 字符串存在很多问题,但我找不到任何可行的建议。非常感谢任何帮助。

4

3 回答 3

2

请注意,这\b可能无法按您的预期工作。\b指定一个单词边界,但 PCRE 认为什么是单词字符取决于脚本运行的语言环境(查看PCRE 转义序列手册页的底部):

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

您可能还想阅读使用 PHP 处理 UTF-8(特别是关于 PCRE 的部分)。

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

所以总的来说它看起来像:

/(?<=\P{L})(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\s*?){4}/
于 2010-09-02T21:24:58.317 回答
0

转换 pattern 和$strto 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 />';
    }
}

执行时会输出:

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

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

于 2010-09-02T18:41:05.717 回答
0

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

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

资源 :

于 2010-09-02T21:16:25.657 回答