这是我长期以来遇到的问题 - 我目前接受用户的完整 html 页面作为输入,并希望过滤/清理它。 HTMLpurifier 的问题在于它删除了 head 、 html 和 body 标签 - 以及 head 中的样式。我已经谷歌,查看了论坛,尝试实现所写的内容,但没有成功。有人可以帮忙吗?
我想要的:保留 HTML 、 HEAD 、 STYLE 、 BODY 标签
我做了什么:
$config->set('HTML.DefinitionID', 'test');
$config->set('HTML.DefinitionRev', 1);
$config->set('HTML.AllowedElements', array('html','head', 'body', 'style', 'div', 'p'));
if ($def = $config->maybeGetRawHTMLDefinition()) {
$def->addElement('html', 'Block', 'Inline', 'Common', array());
$def->addElement('head', 'Block', 'Inline', 'Common', array());
$def->addElement('style', 'Block', 'Inline', 'Common', array());
$def->addElement('body', 'Block', 'Inline', 'Common', array());
}
为什么不使用strip_tags?它支持允许的标签列表。
你需要
$config->set('Core.ConvertDocumentToFragment', false);
无论出于何种原因,
Core.ConvertDocumentToFragment
默认为true
,即使文档指出“对于大多数输入,此处理是不必要的”。
我也被这个困扰了。我从错误收集器得到的只是神秘的消息“已删除文档元数据标签”,而该消息又是内部消息“Lexer:提取的正文”的翻译。
最终结果 - HTMLPurfier 本身不允许完整的 HTML 解析 - 要么扩展它,要么找到一个直通通道
这需要一些工作,但可以自己实现。
所有步骤在这里解释起来都太多了,但我遇到了完全相同的问题。我想将 HTML 内容作为整个文档进行清理,并且必须找出困难的方法,即该库在幕后是如何工作的。
简而言之:
我已经根据博客中的商店软件示例解释了我的用例的方法:https://machinateur.dev/blog/how-to-sanitize-full-html-5-documents-with-htmlpurifier .