今天升级系统PHP版本到PHP7.3,发现站点某些功能没有正常工作。查看PHP错误日志,发现了如下提示:

preg_match(): Compilation failed: invalid range in character class at offset 4 in xxxx on line xxx

找到报错的PHP文件,该行对应的正则匹配为:

preg_match("/^[\w-:]+$/", $search)

根据提示,应该是第四个匹配符号”-“出了问题。

使用上述错误提示查找原因,发现原因是PHP 7.3开始,使用PCRE2作为新版的正则引擎,规则比PCRE更严格。根据PCRE2的要求,如果”-“用于匹配而非表示范围,那么必须转义或放在末尾。上面的正则表达式”-“不是用来表示a-z这样的范围,也不在末尾,因此出现警告,导致网站功能异常。

找到了原因,解决办法也很简单:使用反斜杆转义,即变成 preg_match("/^[\w\-:]+$/", $search)

参考

  1. preg_match(): Compilation failed: invalid range in character class at offset
  2. 一篇文章帮你了解 PHP 7.3 更新
  3. PHP自5.2到5.6中新增功能详解