preg_replace vs DOMDocument replaceChild

时间:2014-05-23 16:46:59

标签: php regex preg-replace domdocument appendchild

我想知道标题中提到的哪种方法可以更有效地替换html页面中的内容。

我的页面中有这个自定义标记:<includes module='footer'/>将替换为某些内容。

现在使用DOMDocument->getElementsByTagName('includes')->item(0)->parentNode->replaceChild时有一些缺点,例如当我忘记在标记中添加斜杠时,就像整个网站崩溃一样<includes module='footer'>

正则表达式允许这样的例外,只要它符合规则。它甚至允许我替换任何字符串,如{includes:footer}

现在回到我的实际问题。使用正则表达式是否有任何缺点,如性能问题......?

更多信息:Append child/element in head using XML Manipulation

欢呼声

2 个答案:

答案 0 :(得分:1)

我不会太担心这里的表现,我会考虑他们&#34;可比的&#34;。需要运行基准来真正确定这一点,因为它取决于文档的大小以及正则表达式的编写方式。

相反,我会关注准确性。通常,DOMDocument在解析XML方面要好得多,因为它是为了阅读和理解语言而构建的。但是,它在<includes module='footer'>上失败了,因为它是一个未封闭的标记(期待:</includes>)。

最常见的HTML / XML格式问题可以通过PHP的Tidy类修复。我会检查一下,因为你应该收到更多"expected results" compared to if you used regex来解析。如果您使用正则表达式,则技术上可能是module之前/之后的属性,includes元素中的元素,<includes module='foo>bar'>等意外字符等。

最后,如果您的XML处于&#34;受控制的&#34;环境(即你知道什么可以和可以发生,你知道什么可能的字符module将包含,你知道它将永远是一个自我关闭元素,包含现在的孩子等),而不是一切使用正则表达式。只知道它正在寻找一套非常特定的规则。但是,如果你希望这可以与#34;你扔掉它的任何东西&#34; ..请使用DOM解析器(Tidy之后“以避免例外情况),无论性能如何(虽然我敢打赌它在许多情况下会非常具有可比性)。

另外,最后需要注意的是,如果您计划在文档中查找/替换/操作许多节点,那么使用DOM解析器可以看到性能的大幅提升。 DOM解析器将获取文档并解析它一次。然后,您只需遍历已加载到其类中的数据。这与使用正则表达式进行比较,正则表达式将在整个文档中运行,以查找一组匹配项。

如果您希望我在任何区域获得更具体的信息(例如,提供Tidy示例或work on a benchmark),请与我们联系。

答案 1 :(得分:0)

所以我使用microtime进行了一些天真的性能测试(真实)。事实证明,使用preg_replace是更快的选择。虽然DOM replaceChild需要2.0到3.5毫秒,但preg_replace需要0.5到1.2毫秒!但我想这只是在我的情况下。

这就是我的html的样子:

<!DOCTYPE html>
<html>
    <head>
        {includes:title}
        {includes:style}
    </head>
    <body>
        {includes:body}
        {includes:footer}
        ...
        allot more here
        ...
    </body>
</html>

这是使用正则表达式:/{([ ]*)includes:([ ]*)$key([^}]*)}/i

正如我所说,我并不完全熟练使用正则表达式,但这确实起了作用。猜猜你是否优化它,它会跑得更快。

对于replaceChild方法,我使用了这样的自定义标记:<includes module='body'/>

同样,这是我本地服务器上的测试,因此我仍需要测试它在我的在线服务器上的行为......