跳过解析 CODE 标签内的 BBCode

Posted

技术标签:

【中文标题】跳过解析 CODE 标签内的 BBCode【英文标题】:Skip parsing the BBCode inside the CODE tag 【发布时间】:2014-02-28 08:34:31 【问题描述】:

我正在使用regex 解析BBCode,以便将其替换为html。由于[code] 标签解析,我现在被卡住了。

基本上,当您使用[code][b]this is bb[/b] [u]code in[/u] [i]code[/i][/code] 时,它不应该替换[b][u][i][code] 标签内部的类似标签。

不幸的是,使用 preg_replace:

$this->_text = preg_replace('/\[i](.+?)\[\/i]/i', '<em>\1</em>', $this->_text);
$this->_text = preg_replace('/\[code](.+?)\[\/code]]/i', '<code>\1</code>', $this->_text);

将导致全部替换,[code] 标签内的代码将变为 HTML 格式。

有什么解决方法吗?我需要想法。在解析其余部分之前,我正在考虑转义 [code] 中的 [] 括号字符,但这个想法听起来很愚蠢。

【问题讨论】:

您无法使用正则表达式解析 HTML 或 BBCode,因为 HTML 和 BBCode 不是“常规语言”的示例。您需要一个适当的解析库,将文档的结构公开给您的程序,然后您可以在其中使用它。 @Dai 如果那是 HTML,我肯定会使用 DOM。对于 BBCode 的基础知识,我想使用正则表达式,我没有看到使用任何代码公开解析库的意义,因为这太多了(正则表达式可以实现我想要的),至少在我的情况下。 您的“解决方法”并不傻,除了@Dai 建议的完整解析器之外,我没有看到其他方法 - 恕我直言,这是“正确的方法 (TM)”。跨度> 只是一个想法,为什么不将方括号[] 替换为尖括号&lt;&gt; 并尝试使用DomDocument 进行解析,不知道它是否会工作:) @gwillie 虽然它无法识别标签名称是否正确,但 应该 可以工作。我喜欢这个主意;) 【参考方案1】:

如果你要从外部解析,你的代码标签需要这样的东西

(?:\[code])(.*)(?=(?:\[\/code]))

但是正如其他人所提到的,你应该非常小心,因为你不能保证会发生什么,它可能是畸形的,然后你会得到一堆乱七八糟的标签,甚至是不完整的混合已解析和未解析的 bbcodes。

如果你有两个[/code][/code],即使我刚刚写的代码也会失败。

【讨论】:

以上是关于跳过解析 CODE 标签内的 BBCode的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CodeKicker BB Code Core 中解析 html 标签

跳过 shpaml 的处理脚本标记的优雅方式

如何使用标签提取标签内的文本?

在wordpress中获取<p>标签内的内容

code标签和pre标签

html的哪个标签内的内容,全部按照原来的样子显示,浏览器不做任何解析?