I-M*_*-JM 56 php regex htmlpurifier
我正在使用HTML Purifier(http://htmlpurifier.org/)
我只是想删除<script>标签.我不想删除内联格式或任何其他东西.
我怎样才能做到这一点?
还有一件事,还有其他方法可以从HTML中删除脚本标记
Dej*_*vic 127
因为这个问题用正则表达式标记,我将在这种情况下用穷人的解决方案回答:
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);
Run Code Online (Sandbox Code Playgroud)
但是,正则表达式不是用于解析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();
Run Code Online (Sandbox Code Playgroud)
我故意删除了HTML,因为即使这样也可以使用bork.
Ale*_*lex 37
使用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();
Run Code Online (Sandbox Code Playgroud)
这让我使用以下HTML文档:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
请记住,DOMDocument解析器需要PHP 5或更高版本.
小智 5
$html = <<<HTML
...
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$tags_to_remove = array('script','style','iframe','link');
foreach($tags_to_remove as $tag){
$element = $dom->getElementsByTagName($tag);
foreach($element as $item){
$item->parentNode->removeChild($item);
}
}
$html = $dom->saveHTML();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
102094 次 |
| 最近记录: |