【问题标题】:Matching UTF Characters with preg_match in PHP: (*UTF8) Works on Windows but not Linux在 PHP 中使用 preg_match 匹配 UTF 字符:(*UTF8) 适用于 Windows 但不适用于 Linux
【发布时间】:2011-01-22 00:56:58
【问题描述】:

我有一个简单的正则表达式来检查用户名:

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 安装上尝试过此操作并得到相同的错误。事实上,我只在我的本地开发环境中看到过这项工作。有没有办法允许适用于所有操作系统的特殊字符?

【问题讨论】:

  • 你希望(*UTF8) 做什么?
  • 好吧,在添加之前,上面的内容会在输入é等字符时返回false。添加后,这些字符被接受并且上面返回true。我期待它允许所说的字符。
  • 这几乎可以肯定是 PHP 版本。您正在运行哪些 PHP 版本? phpinfo() 页面是否包含有关 PCRE 版本的任何信息?

标签: php regex unicode


【解决方案1】:

通过Unicode character properties描述字符来尝试:

preg_match('/^\p{L}[\p{L} _.-]+$/u', $username)

【讨论】:

  • 看起来不错。我相信以下内容也将允许使用原始示例中的数字:preg_match('/^(\p{L}|\p{N})[(\p{L}|\p{N}) _.-]+$/u', $username)
  • @S. DePouw,让'/^[\p{L}\p{N}][\p{L}\p{N} _.-]+$/u'。在字符类中,()| 只匹配 ()|
【解决方案2】:

我已经尝试过使用提到的/u 参数。在 windows (PHP 5.2.16) 上,添加 /u 参数可以很好地捕获包含 unicode 字符的字符串,但是在 CentOS 5 和 PHP 5.2.16 上,我仍然无法捕获包含 unicode 字符的字符串,使用 .* ( preg_match 基本抓不到)。

经过很长时间无处可去,搞乱了没有任何改变的“LOCALE”设置,我终于找到了this site

我对提供的适当版本的 rpm 进行了rpm -Uvh,重新启动了 apache,突然我的正则表达式运行良好!

尽管我最初支持 UTF-8,但在我安装更新的 rpm 之前,我的正则表达式并没有捕获 unicode 字符串,它还添加了“Unicode 属性支持”。我认为支持 UTF-8 就足够了,但显然不是。

【讨论】:

    【解决方案3】:

    这似乎是一个旧帖子,但由于它始终是一个有趣的主题,我将发布我发现的 here。这是一个很小的区别,但使代码更简单。问题是大括号是可选的

    如果有人只想允许字母(Unicode 和非 Unicode)和空格,上面的 Gumbo 和 Scott 的代码可以写得更简单:

    preg_match("/^\pL[\pL ]+$/u",$string)
    

    我还注意到 preg_match 接受更简单的代码,如下所示:

    preg_match("/^[\pL ]+$/u",$string)
    

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2021-05-02
      相关资源
      最近更新 更多