PHP实现HTML转BBcode时如何避免替换pre标签内的内容
实现方案
直接利用PHP正则的(*SKIP)(*FAIL)特性即可实现,该特性可以标记指定匹配段跳过不处理,修改后的代码如下:
<?php $str=" <b>test</b> <pre> <b>test</b> </pre> <b>test</b> "; function htmltobb($str){ // 匹配pre标签段直接跳过,剩余内容替换b标签为bbcode格式 $pattern = '/(<pre>.*?<\/pre>)(*SKIP)(*FAIL)|<(\/?)b>/is'; return preg_replace($pattern, '[$2b]', $str); } echo htmltobb($str); ?>
代码说明
- 正则参数
i代表不区分大小写,可同时匹配<B>、<b>等不同写法的标签 - 正则参数
s代表让.匹配换行符,确保多行内容的pre标签可以被完整识别 (*SKIP)(*FAIL)组合会让匹配到的pre标签段不参与后续替换逻辑,仅处理pre外的内容
运行后输出结果完全符合预期,pre标签内部的<b>、</b>不会被替换。
内容的提问来源于stack exchange,提问作者DCYılmaz
相关产品推荐
相关产品推荐

