PHP使用preg_replace替换时如何保留替换内容中的$1或\1字符
preg_replace替换内容中$1、\1被解析为反向引用的解决方法
问题原因
preg_replace默认会解析替换字符串中$n、\n格式的内容为正则捕获组对应的反向引用,即使正则表达式中不存在对应序号的捕获组,这部分字符也会被识别为反向引用标记替换为空,就会出现$1字符丢失、输出不符合预期的问题。
可行解决方案
方案1:转义替换串特殊字符(适合固定替换内容场景)
传入替换参数前,转义会被识别为反向引用前缀的$和\字符即可,转义后这两类字符会被原样输出:
$replacement = 'Some user content with $1'; // 转义$和反斜杠,避免被解析为反向引用 $replacement = addcslashes($replacement, '$\\'); $s = preg_replace('|#CONTENT#|', $replacement, 'Bla-bla #CONTENT#'); // 输出结果:Bla-bla Some content with $1
注意:不要用
preg_quote()处理替换字符串,该函数是用于转义正则表达式模式中的特殊字符,不适用于替换串的反向引用转义场景。
方案2:使用preg_replace_callback(最推荐,适合动态/用户生成内容场景)
preg_replace_callback不会对回调函数返回的字符串做任何反向引用解析,返回内容会被原样替换到匹配位置,完全不需要额外转义,替换内容是用户输入等不可控内容时优先用这个方案:
$replacement = 'Some user content with $1'; $s = preg_replace_callback('|#CONTENT#|', function($matches) use ($replacement) { return $replacement; }, 'Bla-bla #CONTENT#'); // 输出结果:Bla-bla Some content with $1
内容的提问来源于stack exchange,提问作者M-A-X
相关产品推荐
相关产品推荐

