strip_tags()函数使用黑名单而非白名单。

6

我最近发现了strip_tags()函数,它以字符串和允许的HTML标记列表作为参数。

假设我想要在一个字符串中去掉图片,这里是一个例子:

$html = '<img src="example.png">';
$html = '<p><strong>This should be bold</strong></p>';
$html .= '<p>This is awesome</p>';
$html .= '<strong>This should be bold</strong>';

echo strip_tags($html,"<p>");

返回这个值:

<p>This should be bold</p>
<p>This is awesome</p>
This should be bold

因此, 我已经清除了通过 <strong> 和可能在将来使用的<em> 的格式。

我想要一种黑名单而不是白名单的方式,比如:

echo blacklist_tags($html,"<img>");

返回:

<p><strong>This should be bold<strong></p>
<p>This is awesome</p>
<strong>This should be bold<strong>

有没有任何方法可以做到这一点?

4
在这里使用黑名单是错误的方法。坚持使用白名单并添加所有你想要的元素。仅仅因为在使用黑名单时会遗漏一些元素,例如 <video>, <script> 等等。 - Shi
我会错过元素吗?我只想删除<img>标签。为了防止意外删除标签,我必须添加每个标签,例如 <p><em><strong><blockquote><ul><li> - ThomasReggi
3
<script type="text/javascript">document.write('<img src="…">');</script> 这段代码的意思是:使用JavaScript脚本语言,在网页中插入一张图片,图片的URL地址在代码中被省略了。 - Shi
2个回答

7
如果你只希望删除 <img> 标签,可以使用 DOMDocument 而不是 strip_tags()
$dom = new DOMDocument();
$dom->loadHTML($your_html_string);

// Find all the <img> tags
$imgs = $dom->getElementsByTagName("img");

// And remove them
$imgs_remove = array();
foreach ($imgs as $img) {
  $imgs_remove[] = $img;
}

foreach ($imgs_remove as $i) {
  $i->parentNode->removeChild($i);
}
$output = $dom->saveHTML();

我不知道 removeChild() 会删除任何下降元素,而不仅仅是直接子元素。好好知道。编辑:或者我理解错了吗? - Decent Dabbler
@fireeyedboy 是的,可以删除任何节点,不一定是直接后代节点。 - Michael Berkowski
@fireeyedboy 实际上我刚刚测试了一下,结果并不像我想的那样。相反,你必须从 parentNode 中删除。已更改以上内容。 - Michael Berkowski

1

你只能通过编写自定义函数来实现这一点。尽管如此,strip_tags() 被认为更安全,因为你可能会忘记将某些标签列入黑名单...

PS:在 php.net 的 strip_tags() 页面 的评论中可以找到一些示例函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接