我有一个简单的正则表达式来检查用户名:
preg_match('/(*UTF8)^[[:alnum:]]([[:alnum:]]|[ _.-])+$/i', $username);
在本地测试(使用WAMP的Windows 7)中,这将允许使用UTF字符的用户名(例如é或ñ)。但是,当我在实际托管该站点的服务器上进行测试时,我收到以下警告:
警告:preg_match()[function.preg-match]:编译失败:(* VERB)在第12行/home/sites/vgmusic.com/test/Core/Impl/FormElementValidator.php中的偏移5处无法识别
我也在本地Ubuntu安装上试过这个并得到同样的错误。事实上,我只在我的本地开发环境中看到过这项工作。有没有办法允许适用于所有操作系统的特殊字符?
答案 0 :(得分:15)
通过Unicode character properties:
描述字符来尝试preg_match('/^\p{L}[\p{L} _.-]+$/u', $username)
答案 1 :(得分:2)
我一直在尝试使用提到的/u
参数。在Windows(PHP 5.2.16)上,添加/u
参数可以很好地捕获包含unicode字符的字符串,但是在CentOS 5和PHP 5.2.16上,我仍然无法捕获包含unicode字符的字符串,使用{{ 1}}(preg_match基本上无法捕获)。
经过很长一段时间无处可去,弄乱了没有改变的'LOCALE'设置,我终于找到了this site。
我提供了.*
相应的rpm版本,重新启动了apache,突然我的正则表达式工作得很好!
即使我最初支持UTF-8,我的正则表达式也没有捕获unicode字符串,直到我安装了更新的rpm,这也增加了“Unicode属性支持”。我认为拥有UTF-8支持已足够,但显然不是。
答案 2 :(得分:1)
它似乎是一个旧帖子,但由于它始终是我感兴趣的主题,我将发布我发现的here。这是一个小差异,但使代码更简单。问题是花括号是可选的。
如果有人想只允许字母(Unicode和非Unicode)和空格,那么上面的Gumbo和Scott代码可以写得更简单:
preg_match("/^\pL[\pL ]+$/u",$string)
我还注意到preg_match接受了更简单的代码,如下所示:
preg_match("/^[\pL ]+$/u",$string)