感谢您的答案:
“正则表达式,用于检测写为单词的数字”:
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字符串,但我无法得到任何建议的工作。任何帮助非常感谢。
答案 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)
资源: