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

如何用正则实现BBCode与HTML互转 无需预设标签替换数组

问题原因
  • 正则默认贪婪匹配:.*为贪婪匹配规则,会从第一个[开始匹配到全文最后一个[/之前的所有内容,仅能替换最外层标签,中间嵌套标签无法被识别。
  • 无标签一致性校验:未对开闭标签的名称做匹配校验,容易出现标签错配问题。
  • 单次替换无法适配嵌套结构:BBCode为多层嵌套格式,单次正则替换仅能处理一层标签,无法覆盖所有嵌套层级。
  • 未覆盖自闭合标签场景:[br]、[img]这类无对应闭合标签的元素,现有规则无法匹配。
解决方案

修正后代码

<?php
$sentence = '[html style="font-size: 18px;" dir="ltr"][div style="font-size: 18px;" dir="ltr"][p style="font-weight: bold;"]Hello,[/p][p]You have got a new message from [a href="https://www.example.com/"]Example.com[/a][br][br].You could check your message on [a href="https://www.example.com/en/manager/inbox.html"]Manager[/a][/p][p][img src="https://www.example.com/assets/images/logo-default-120x50.png" width="120px" height="80px"][div style="color: #D4192D; font-weight: bold;"]Example.com Team[/div][/p][/div][/html]';

// 循环替换所有成对BBCode标签,直到无匹配项为止
$pairPattern = '/\[([a-z0-9]+)([^]]*)\](.*?)\[\/\1\]/is';
$pairReplace = '<$1$2>$3</$1>';
do {
    $sentence = preg_replace($pairPattern, $pairReplace, $sentence, -1, $replaceCount);
} while ($replaceCount > 0);

// 处理剩余自闭合标签(br、img等无闭合标签的元素)
$singlePattern = '/\[([a-z0-9]+)([^]]*)\]/i';
$singleReplace = '<$1$2>';
$sentence = preg_replace($singlePattern, $singleReplace, $sentence);

echo $sentence;
?>

逻辑说明

  • 成对标签正则使用反向引用\1,强制要求开闭标签名称一致,避免错配。
  • 用非贪婪匹配.*?配合s修饰符,仅匹配当前开标签对应的第一个闭标签范围,不会跨标签贪婪匹配。
  • 增加循环替换逻辑,每次处理一层嵌套标签,直到所有成对标签全部替换完成,支持任意层级的嵌套结构。
  • 最后单独处理无闭合标签的自闭合元素,覆盖br、img等单标签场景。
  • 无需提前预定义标签列表,可适配任意自定义标签的转换需求。

内容的提问来源于stack exchange,提问作者newCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:36:04