PHP 7.4中preg_replace无法运行,出现正则编译失败警告
解决PHP 7.4中preg_replace的编译错误问题
这个警告的根源很明确——你的第三个正则表达式犯了一个常见的正则错误:把锚点\A放在了字符类[]里面。\A是用来匹配字符串起始位置的零宽度断言,它不属于任何字符集合,所以不能塞进[]里,这直接导致了正则引擎编译失败。
我帮你把代码修复好了,同时还做了一些优化,让正则更简洁高效:
$regex = array( // 移除行首的空白和制表符 "`^(\s+)`ism" => '', // 移除文件开头的块注释 "`^/\*(.+?)\*/`ism" => "", // 移除代码中的块注释(保留注释前的换行/分号) "`([\n;]+|^)/\*(.+?)\*/`ism" => "$1", // 移除单行注释(保留注释前的换行/分号) "`([\n\A;\s]+)//(.+?)[\n\r]`ism" => "$1\n", // 合并多余的空白换行 "`(^[\r\n]*|[\r\n]+)\s*[\r\n]+`ism" => "\n" ); $file_content = preg_replace(array_keys($regex), $regex, $file_content);
关键调整说明:
- 修复了第三个正则的错误:把原来的
([\n\A;]+)改成了([\n;]+|^),这样既保留了“匹配换行符、分号,或者字符串开头”的原意,又避免了把锚点放进字符类的错误。 - 简化了正则里的
/转义:因为你用反引号作为正则分隔符,所以/不需要转义,直接写/`就行,让正则更易读。 - 优化了第一个正则的
[\t\s]:\s已经包含了制表符\t,所以直接用\s就足够了,避免重复匹配。
这样修改后,你的代码就能在PHP 7.4里正常工作,不会再出现编译错误的警告了。
内容的提问来源于stack exchange,提问作者Meir Levi
相关产品推荐
相关产品推荐

