我正在尝试为PHP中的名称编写一个合理宽松的验证器,我的第一次尝试包含以下模式:
// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";
这最终会传递给preg_match()
。据我所知,这适用于你的vanilla ASCII字母表,但似乎会Ă或更像sp或张等字符。
模式本身有问题吗?也许我期待\p{L}
做比我想象的更多的工作?
或者是否与传入输入的方式有关?我不确定它是否相关,但我确实在表单页面上指定了UTF8编码。
答案 0 :(得分:25)
我认为问题比这简单得多:您忘了指定u
modifier。 Unicode字符属性为only available in UTF-8 mode。
你的正则表达式应该是:
// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
答案 1 :(得分:1)
如果您想用old pattern
替换Unicode new pattern
,您应该写:
$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);
所以这里的关键是u
修饰符
注意:您的服务器php version
至少应为PHP 4.3.5
如此处所述php.net | Pattern Modifiers
你好(PCRE_UTF8) 此修饰符打开与Perl不兼容的PCRE的其他功能。模式字符串被视为UTF-8。这个 在Unix和PHP上,可以从PHP 4.1.0或更高版本获得修饰符 4.2.3在win32上。从PHP 4.3.5开始检查模式的UTF-8有效性。
感谢AgreeOrNot
在preg_replace match whole word in arabic
我尝试了它并且它在localhost中工作但是当我在远程服务器中尝试它时它不起作用,然后我发现php.net开始在PHP 4.3.5中使用u
修饰符。 ,我升级php版本,它的工作原理
重要的是要知道这种方法对阿拉伯语用户(عربي)非常有用,因为 - 我认为 - unicode是阿拉伯语的最佳编码,如果你不使用{{1},替换将无效}修饰符,请参见下一个示例,它应该与您合作
u
答案 2 :(得分:0)
首先,如果你在写这些时使用单撇号而不是双引号,你的生活将会轻松得多 - 你只需要一个反斜杠。其次,还应包括组合标记\pM
。如果找到不匹配的字符,请找出其Unicode代码点,然后您可以使用http://www.fileformat.info/info/unicode/找出它的位置。在使用UTF-8属性进行调试时,我发现http://hsivonen.iki.fi/php-utf8/是一个非常宝贵的工具(在尝试查找之前不要忘记转换为十六进制:array_map('dechex', utf8ToUnicode($text))
)。
例如,Ă原来是http://www.fileformat.info/info/unicode/char/0102/index.htm并且在Lu中,所以L应该匹配它,它确实匹配我。另一个角色是http://www.fileformat.info/info/unicode/char/5f20/index.htm,也是字母,确实与我匹配。你有编译的Unicode字符表吗?
答案 3 :(得分:0)
其他任何人在这里查看并无法正常使用时,请注意/u
不会在不同PHP版本的Unicode脚本中产生一致的结果。
请参阅示例:https://3v4l.org/4hB9e
相关:Incosistent regex result for Thai characters across different PHP version
答案 4 :(得分:0)
<?php preg_match('/[a-zığüşöç]/u',$title) ?>