gpt4 book ai didi

php - DOMDocument 从 HTML 源中删除脚本标签

转载 作者:行者123 更新时间:2023-12-03 00:36:43 24 4
gpt4 key购买 nike

我用了@Alex's approach here使用内置 DOMDocument 从 HTML 文档中删除脚本标签。问题是,如果我有一个包含 Javascript 内容的脚本标记,然后有另一个链接到外部 Javascript 源文件的脚本标记,则并非所有脚本标记都会从 HTML 中删除。

$result = '
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
alert("hello");
</script>
</head>
<body>hey</body>
</html>
';

$dom = new DOMDocument();
if($dom->loadHTML($result))
{
$script_tags = $dom->getElementsByTagName('script');

$length = $script_tags->length;

for ($i = 0; $i < $length; $i++) {
if(is_object($script_tags->item($i)->parentNode)) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
}

echo $dom->saveHTML();
}

以上代码输出:

<html>
<head>
<meta charset="utf-8">
<title>hey</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>

从输出中可以看到,仅删除了外部脚本标记。我可以采取什么措施来确保删除所有脚本标签?

最佳答案

你的错误实际上是微不足道的。 DOMNode 对象(及其所有后代 - DOMElementDOMNodeList 和其他一些!)在其父元素发生更改时自动更新,最值得注意的是当它的 child 数量发生变化时。这在 PHP 文档中只写了几行,但大部分都被隐藏起来了。

如果您使用 ($k instanceof DOMNode)->length 循环,然后从节点中删除元素,您会注意到 length 属性实际上发生了变化!我必须编写自己的库来解决这个问题以及其他一些问题。

解决办法:

if($dom->loadHTML($result))
{
while (($r = $dom->getElementsByTagName("script")) && $r->length) {
$r->item(0)->parentNode->removeChild($r->item(0));
}
echo $dom->saveHTML();

我实际上并没有循环 - 只是一次弹出第一个元素。结果:http://sebrenauld.co.uk/domremovescript.php

关于php - DOMDocument 从 HTML 源中删除脚本标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15925961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com