You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:18:00