跳过解析 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)”。跨度>
只是一个想法,为什么不将方括号[]
替换为尖括号<>
并尝试使用DomDocument
进行解析,不知道它是否会工作:)
@gwillie 虽然它无法识别标签名称是否正确,但 应该 可以工作。我喜欢这个主意;)
【参考方案1】:
如果你要从外部解析,你的代码标签需要这样的东西
(?:\[code])(.*)(?=(?:\[\/code]))
但是正如其他人所提到的,你应该非常小心,因为你不能保证会发生什么,它可能是畸形的,然后你会得到一堆乱七八糟的标签,甚至是不完整的混合已解析和未解析的 bbcodes。
如果你有两个[/code][/code],即使我刚刚写的代码也会失败。
【讨论】:
以上是关于跳过解析 CODE 标签内的 BBCode的主要内容,如果未能解决你的问题,请参考以下文章