我正在尝试用PHP编写一个权限合理的名称验证器,我的第一次尝试包括以下模式:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
这最终传递给对preg_match()
的调用。 据我所知,这在你的ASCII字母表中很有效,但似乎会被更辣的字符(如sichor)绊倒。
是不是图案本身出了问题? 也许我期望\p{L}
做的工作比我想象的要多?
还是与输入传递的方式有关? 我不确定它是否相关,但我确实确保在表单页面上指定了UTF8编码。
我认为问题要简单得多:您忘了指定u
修饰符。 Unicode字符属性仅在UTF-8模式下可用。
正则表达式应为:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
如果要用新模式
替换Unicode旧模式
,则应写入:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
所以这里的关键是u
修饰符
注意:您的服务器PHP版本
应该至少是PHP 4.3.5
正如这里提到的,PHP.NET模式修饰符
u(PCRE_UTF8)此修饰符打开了PCRE与Perl不兼容的附加功能。 模式字符串被视为UTF-8。 Unix上的PHP 4.1.0或更高版本以及Win32上的PHP 4.2.3都提供了此修饰符。 从PHP 4.3.5开始检查模式的UTF-8有效性。
谢谢agreeornot
谁在这里给我关键字preg_replace匹配阿拉伯语的整个单词
我尝试了一下,它在本地主机上可以工作,但是当我在远程服务器上尝试时,它不工作,然后我发现PHP.NET开始使用PHP4.3.5中的u
修饰符。 ,我升级了php版本,它工作
知道这种方法对阿拉伯语用户非常有帮助很重要,因为我相信unicode是阿拉伯语的最佳编码,如果不使用u
修饰符,替换将不起作用,请参见下一个示例,它应该对您有用
$text=preg_replace('/\b\b/u','new',$text);
首先,如果在写这些时使用单引号而不是双引号,你的生活将会变得容易得多--你只需要一个反斜杠。 第二,还应包括组合标记\pm
。 如果您发现一个字符不匹配,请找出它的Unicode码位,然后使用http://www.fileformat.info/info/Unicode/找出它的位置。 在使用UTF-8属性进行调试时,我发现了http://hsivonen.iki.fi/php-utf8//这是一个非常宝贵的工具(在尝试查找之前不要忘记转换为十六进制:array_map('dechex',utf8ToUnicode($text))
)。
例如,nEvent原来是http://www.fileformat.info/info/unicode/char/0102/index.htm,并且位于Lu中,因此L应该与之匹配,它确实与我匹配。 另一个字符是http://www.fileformat.info/info/unicode/char/5f20/index.htm,也是isLetter,确实与我匹配。 你有Unicode字符表编译吗?