从 HTML 内容中删除脚本标记

2022-08-30 08:53:04

我正在使用 HTML 净化器 (http://htmlpurifier.org/)

我只想删除标签。我不想删除内联格式或任何其他内容。<script>

我怎样才能做到这一点?

还有一件事,它有任何其他方法可以从HTML中删除脚本标签


答案 1

因为这个问题被标记为,我将在这种情况下用穷人的解决方案来回答:

$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,因为即使这样也会无聊


答案 2

使用 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


推荐