除非被特定标签包围,否则替换字符
Posted
技术标签:
【中文标题】除非被特定标签包围,否则替换字符【英文标题】:Replace character UNLESS surrounded by specific tag 【发布时间】: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,尽管它非常简单且可预测。但是,是的,你是绝对正确的。 【参考方案1】:这可能工作:
\s*\s*(?:(?!(?:.*?</var>))|(?=[^<]+<var>))
差不多,我改写了这个问题:我只匹配可以证明在<var>
之外的花括号,而不是匹配<var>
内的花括号。因此,花括号位于 <var>
之外,如果:
-
可以断言这是真的:
(?!(?:.*?</var>))
,它使用负前瞻来确保我们不会击中结束 </var>
标记,或
可以断言这是真的:(?=[^<]+<var>)
,它使用积极的前瞻来确保我们最终会在某个地方打到开头的<var>
标签。
嵌套<var>
标签肯定会失败,但它似乎适用于我使用的测试用例。您可以在 RegExr 上运行它并告诉我您的想法。
【讨论】:
@Qtax - 是的,我忘记了那个测试用例。我已经更新了它,它似乎适用于那个测试用例。但是,现在如果遇到流浪的<
,它将失败。所以,这是一个权衡。
@nickb - 非常感谢!我意识到这可能并非在所有情况下都是完美的,但由于我完全控制了正在解析的内容,所以应该这样做。到目前为止,它适用于我所有的测试用例。再次感谢! +1 用于解释正则表达式部分。以上是关于除非被特定标签包围,否则替换字符的主要内容,如果未能解决你的问题,请参考以下文章