经常表达的检测数字写成的话-UTF-8输入
-
26-09-2019 - |
题
谢谢你的回答:
"经常表达的检测数字写成的话":
我现在有这样的工作,但是我也有同样要求,但该数字词在阿拉伯语(或者任何其他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)
资源:
不隶属于 StackOverflow