【发布时间】:2012-09-13 15:16:22
【问题描述】:
我尝试使用 php 将一些可怕的无效 html 代码映射到我以后需要的 xml 结构。这工作得很好,但总有一些我无法处理的部分。所以决定是,只删除该代码,以使 xml 保持有效。这就是它的样子。
<body>
<item>abc</item>
<item>def</item>
unparsable rest
</body>
所以目标是找到一个解决方案(可能是正则表达式,但我愿意接受任何解决方案)来删除“无法解析的其余部分”。
我尝试在这个正则表达式中使用 preg_replace
/<\/item>(((?!item).)*)\s*<\/body>/iU
它工作得很好,与我想要在 $1 中的部分完全匹配,最后一个 和 之间的所有东西,但是由于 xmls 非常大,计算只是在几毫秒后崩溃。我知道正则表达式在做负前瞻方面不太好,但我认为它没有那么糟糕。
因此需要一个更有效的解决方案。不幸的是,我不能使用 strrpos,因为在
之后还有更多标签【问题讨论】:
-
过度简化,您可以检查
</tag>.*?<基本上在元素的结束标记和下一个(有效的)开始标记之间的任何格式错误。虽然这种询问应该通过解析器完成,而不是用模式强制它。 (不是说你嫁给了模式,但解析器会是更好的选择)。 -
但是解析器可能无法解析无效的东西,这正是我的问题:)
-
和
</item>.*?<将匹配第一个结束项目,而不是最后一个,因为它不知道,我想要的文本中不应该有另一个项目 -
我不是说开箱即用的东西,我是说你最好写一个解析器。您提到这是之前转换的结果。之前的转换听起来需要处理,而不是失败的创可贴。
-
好吧,如果你告诉我一个 HTML-Parser 可以处理像
<p><b>text</p></b>这样的事情(这是一个不错的错误),我会接受它:) 但是 loadHtml() 没有机会全部。我实际上正在编写很多不会出错的解析规则,但在某些时候,一页只需要 20 个小时。所以决定只是删除其余部分。
标签: php regex regex-negation performance regex-lookarounds