【发布时间】:2012-07-12 14:45:08
【问题描述】:
首先,是的,我知道永远不应该使用正则表达式来解析 HTML,但是,在这种情况下,我将获取一长串文本(实际上是 var_dump() 的输出)并使用多个正则表达式将其转换为XHTML,所以我确切地知道我将要处理什么标签。我序列中的最后两个正则表达式查找花括号并转换为 XHTML 片段。它很好用,除非花括号包含在字符串变量中,我在之前的正则表达式中的 <var></var> 标记之间输出。
所以,目前,我正在使用:/\s*{\s*/u。我需要做的是调整它以忽略<var></var> 标签中任何地方的任何花括号。
我尝试过使用:/\s*{\s*(?!(?<!<var>)[^\{]*<\/var>)/u,但这并不完全正确。我还没有确定导致它无法正常工作的条件是什么。所以,我可能很接近这个正则表达式,或者我可能会走得很远。因此需要 SO 专业知识。谢谢。
另外,如果这根本不可能,我还可以做其他黑客攻击,即 base64_encode() 字符串,将其粘贴在 <var></var> 标签中,然后作为最后一个正则表达式,base64_decode() 任何被 @ 包围的东西987654326@ 标签。我更愿意找到一个可用的正则表达式,更重要的是,只是好奇它是否可能。
【问题讨论】:
-
您偶然发现了正则表达式不适合解析 HTML 的领域之一。虽然您可能会根据自己的情况编写代码,但我不禁要注意这一点。
-
听起来像是在重新发明轮子。如果您想使用 var_dump() 并将其放在屏幕上进行调试,请查看 Krumo、PQP 或无数其他类似项目之一。如果你坚持走自己的路,你可能最好重新实现 var_dump() 的逻辑并遍历你的对象,而不是尝试转换文本。
-
@SeanMcSomething:我很久以前写过这篇文章,当时并不知道这些项目(尽管我很快就发现了它们)。到目前为止,我的大部分工作已经完成,并且完全按照我的意愿工作,将大括号的这个非常罕见的例外保存在字符串变量中。我一直在忍受它,但现在有一些时间来修复它。
-
@JasonMcCreary:我完全同意。用正则表达式解析 HTML 是错误的。哈哈。但是,当我第一次开始时,我认为我可以编写一个怪物正则表达式来将整个字符串转换为 XHTML。我做不到,所以它被分成了几个正则表达式。这让我不得不尝试解析 HTML,尽管它非常简单且可预测。但是,是的,你是绝对正确的。