PHP升级至5.4后preg_match报Unknown modifier '('错误的解决方法
修复preg_match()的「Unknown modifier '('」警告
这个警告的问题很明确——你的正则表达式分隔符使用出错了,跟PHP版本升级到5.4的关联其实不大,只是新版本的语法检查更严格,让之前潜在的问题显现出来了。
错误原因
你用了/作为正则表达式的分隔符,但正则内容里的Mozilla/包含了一个未转义的/。PHP会把第一个/看作正则的起始分隔符,紧接着的(就被当成了正则修饰符(比如i、m这类合法修饰符),但(根本不是合法的修饰符,所以就抛出了这个警告。
两种修复方案
方案1:转义正则中的斜杠
把正则里的/转义成\/,让PHP把它当作普通字符处理:
preg_match( '/Mozilla\/([0-9].[0-9]{1,2})/', $_SERVER['HTTP_USER_AGENT'], $log_version);
方案2:更换分隔符(更推荐)
换一个不会和正则内容冲突的分隔符,比如#或者~,这样就不用转义斜杠了,代码可读性更高:
// 使用#作为分隔符 preg_match( '#Mozilla/([0-9].[0-9]{1,2})#', $_SERVER['HTTP_USER_AGENT'], $log_version); // 或者使用~作为分隔符 preg_match( '~Mozilla/([0-9].[0-9]{1,2})~', $_SERVER['HTTP_USER_AGENT'], $log_version);
额外建议
顺便提一句:$HTTP_USER_AGENT是PHP的旧版超全局变量写法,在PHP 5.4及以后,register_globals默认是关闭的,这个变量可能无法正常获取值。推荐使用标准的超全局数组$_SERVER['HTTP_USER_AGENT']来获取用户代理信息,兼容性和安全性更好。
内容的提问来源于stack exchange,提问作者Uttam Panara
相关产品推荐
相关产品推荐

