替换由特定标记包围的字符UNLESS

时间:2012-07-12 19:01:55

标签: php regex

首先,是的,我知道正则表达式永远不应该用于解析HTML,但是,在这种情况下,我需要一长串文本(实际上是var_dump()的输出)并使用几个正则表达式将其转换为XHTML所以我确切地知道我要处理的标签。我序列中的最后两个正则表达式寻找花括号并转换为XHTML片段。除了大括号包含在字符串变量中之外,它的效果非常好,我在前一个正则表达式中的<var></var>标签之间输出。

所以,目前,我正在使用:/\s*{\s*/u。我需要做的是调整它以忽略<var></var>标签内任何花括号。

我尝试过使用:/\s*{\s*(?!(?<!<var>)[^\{]*<\/var>)/u,但这不太对劲。我还没有确定条件是什么让它无法正常工作。所以,我可能会接近这个正则表达式,或者我可能会离开。因此需要SO专业知识。谢谢。

另外,如果这根本不可能,我可以做其他的黑客攻击,即base64_encode()字符串,将其粘贴在<var></var>标签中,然后作为最后一个正则表达式,base64_decode()包围任何东西按<var></var>标签。我更愿意找到一个可用的正则表达式,更重要的是,如果可能的话,只是好奇。

1 个答案:

答案 0 :(得分:3)

可能有效:

\s*{\s*(?:(?!(?:.*?</var>))|(?=[^<]+<var>))

差不多,我重新提出了这个问题:我没有匹配<var>中的花括号,而只匹配可以证明在<var>之外的花括号。因此,大括号位于<var>之外,如果:

  1. 可以断言这是真的:(?!(?:.*?</var>)),它使用否定前瞻来确保我们没有点击结束</var>标签,
  2. 可以断言这是真的:(?=[^<]+<var>),它使用正向前瞻来确保我们最终会到达开头<var>标记的某个地方。
  3. 嵌套的<var>标签肯定会失败,但它似乎适用于我使用的测试用例。您可以在RegExr上运行它并告诉我您的想法。