从 HTML 内容中删除脚本标记
2022-08-30 08:53:04
我正在使用 HTML 净化器 (http://htmlpurifier.org/)
我只想删除标签。我不想删除内联格式或任何其他内容。<script>
我怎样才能做到这一点?
还有一件事,它有任何其他方法可以从HTML中删除脚本标签
我正在使用 HTML 净化器 (http://htmlpurifier.org/)
我只想删除标签。我不想删除内联格式或任何其他内容。<script>
我怎样才能做到这一点?
还有一件事,它有任何其他方法可以从HTML中删除脚本标签
因为这个问题被标记为正则表达式,我将在这种情况下用穷人的解决方案来回答:
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);
但是,正则表达式不是用于解析HTML / XML的,即使您编写了它最终会中断的完美表达式,也不值得这样做,尽管在某些情况下,快速修复某些标记很有用,并且像快速修复一样,忘记安全性。仅对您信任的内容/标记使用正则表达式。
请记住,用户输入的任何内容都应被视为不安全。
这里更好的解决方案是使用为此而设计的。下面是一个片段,演示了做同样的事情是多么简单,干净(与正则表达式相比),(几乎)可靠和(几乎)安全:DOMDocument
<?php
$html = <<<HTML
...
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$script = $dom->getElementsByTagName('script');
$remove = [];
foreach($script as $item)
{
$remove[] = $item;
}
foreach ($remove as $item)
{
$item->parentNode->removeChild($item);
}
$html = $dom->saveHTML();
我有意删除了HTML,因为即使这样也会无聊。
使用 PHP DOMDocument
解析器。
$doc = new DOMDocument();
// load the HTML string we want to strip
$doc->loadHTML($html);
// get all the script tags
$script_tags = $doc->getElementsByTagName('script');
$length = $script_tags->length;
// for each tag, remove it from the DOM
for ($i = 0; $i < $length; $i++) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
// get the HTML string back
$no_script_html_string = $doc->saveHTML();
这通过使用下面的HTML文档使我工作:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
请记住,解析器需要 PHP 5 或更高版本。DOMDocument