去除所有HTML标签,但保留指定的标签。

39

我看到了很多用于删除特定标签(或许多指定标签)的表达式,以及一种只保留一个特定标签的表达式,但我还没有找到一种在PHP中排除多个标签后删除其他所有标签的方法(即删除除了p、b、i、u、a、ul、ol、li之外的所有标签)。我对正则表达式不是很熟悉,所以我需要帮手。 :) 谢谢!


1
如果您没有使用HTML5,您可能需要查看:http://htmlpurifier.org/ - Jim
或者使用来自PEAR的HTML_Safe包。它有一个选项可以设置允许的标签列表。 - Dmitri
3个回答

68

你可以使用strip_tags函数来完成这个操作。

strip_tags — 从字符串中去除 HTML 和 PHP 标记

 strip_tags($contant,'tag you want to allow');

喜欢

  strip_tags($contant,'<code><p>');

10
感谢您解释如何排除多个标签。原始文档在这一点上并不是很清楚。 - Hexodus
如何允许此标签?我无法使其工作。<link rel="canonical" href="http://www.ann24h.com/2017/10/blog-post_89.html"> - Msy Marina
从PHP 7.4开始,您可以使用数组代替字符串。 $html_value = strip_tags($contente, ['code', 'p']); - Mohamad Hamouday

51

有趣的是,strip_tags 函数没有选项可以去除非允许标签内的内容。如果有这个选项,该函数会更加通用。 - coder.in.me
http://www.php.net/strip_tags 页面确实有一个可以做到这一点的函数。mariusz.tarnaski 的 strip_tags_content 函数。 - Elliot Robert
为什么这是被接受的答案?????strip_tags()并不完全如此! 标题说:删除所有HTML标签,»»»»»»除了««««««允许的 对于strip_tags(),可以指定要包含什么,而不能指定要排除什么。 - icefront
@icefront - 你需要学习阅读...从文档中引用:您可以使用可选的第二个参数来指定不应被剥离的标记。这些可以作为字符串给出,或者从PHP 7.4.0开始,可以作为数组。 - Rufinus
1
@icefront 因为这就是答案。String_tags 接受第二个参数,我们可以在其中描述应允许的标签。 - Daniel Wu

6
如果你需要更大的灵活性,可以使用基于正则表达式的解决方案并在此基础上构建。如上所述,strip_tags仍然应该是首选方法。
以下代码将只去除您指定的标签(黑名单):
// tags separated by vertical bar
$strip_tags = "a|strong|em";

// target html
$html = '<em><b>ha<a href="" title="">d</a>f</em></b>';

// Regex is loose and works for closing/opening tags across multiple lines and
// is case-insensitive

$clean_html = preg_replace("#<\s*\/?(".$strip_tags.")\s*[^>]*?>#im", '', $html);

// prints "<b>hadf</b>";
echo $clean_html;

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