今天升级系统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)
。