PHP中如何通过正则表达式移除带参数的自定义多行BB代码及内容
PHP 剥离任意带参数BB标签及包裹内容的解决方案
原正则失效原因
- 默认配置下正则的
.元字符不匹配换行符,无法处理多行包裹内容 - 固定匹配QUOTE标签,无法适配任意标签名的场景
最终可用正则及说明
你需要使用带修饰符的正则实现需求,非嵌套场景下单次替换即可生效:
正则:/\[([a-z0-9_]+)[^\]]*\](.*?)\[\/\1\]/is
各部分作用说明:
\[([a-z0-9_]+):匹配起始标签的左括号和标签名(可根据实际业务调整标签名的允许字符规则)[^\]]*\]:匹配标签后的所有参数,直到遇到右括号闭合起始标签(.*?):非贪婪匹配标签包裹的所有内容\[\/\1\]:反向引用前面匹配到的标签名,匹配对应闭合标签- 修饰符
i:忽略大小写,适配大小写混合的标签写法 - 修饰符
s:开启DOTALL模式,让.可以匹配换行符,解决多行内容匹配问题
代码示例
普通场景(无嵌套标签)
<?php // 输入内容 $input = '[T1 id=123]Hi[/T1], How [T2 id=567]are[/T2] you [QuestionMark id=789]?[/QuestionMark]'; // 执行替换 $result = preg_replace('/\[([a-z0-9_]+)[^\]]*\](.*?)\[\/\1\]/is', '', $input); // 输出结果:, How you echo $result; ?>
嵌套标签场景
如果存在标签嵌套的情况,可以循环执行替换直到没有可匹配的标签为止:
<?php $input = '[OUTER id=1][INNER id=2]嵌套内容[/INNER][/OUTER]测试文本'; do { $input = preg_replace('/\[([a-z0-9_]+)[^\]]*\](.*?)\[\/\1\]/is', '', $input, -1, $replaceCount); } while ($replaceCount > 0); // 输出结果:测试文本 echo $input; ?>
内容的提问来源于stack exchange,提问作者TPArrow
相关产品推荐
相关产品推荐

