【发布时间】: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 虽然它无法识别标签名称是否正确,但 应该 可以工作。我喜欢这个主意;)