我想知道标题中提到的哪种方法可以更有效地替换html页面中的内容。
我的页面中有这个自定义标记:<includes module='footer'/>
将替换为某些内容。
现在使用DOMDocument->getElementsByTagName('includes')->item(0)->parentNode->replaceChild
时有一些缺点,例如当我忘记在标记中添加斜杠时,就像整个网站崩溃一样<includes module='footer'>
。
正则表达式允许这样的例外,只要它符合规则。它甚至允许我替换任何字符串,如{includes:footer}
。
现在回到我的实际问题。使用正则表达式是否有任何缺点,如性能问题......?
更多信息:Append child/element in head using XML Manipulation
欢呼声
答案 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'/>
同样,这是我本地服务器上的测试,因此我仍需要测试它在我的在线服务器上的行为......