清理 HTML 并关闭不完整的标签

Posted

技术标签:

【中文标题】清理 HTML 并关闭不完整的标签【英文标题】:Sanitize HTML and close incomplete tags 【发布时间】:2012-04-13 13:40:06 【问题描述】:

ApplicationHelper 中的sanitize() 不会关闭标签。

s = "<a href='http://example.com'>incomplete"
sanitize(s, :tags => ['a', 'p'])

上面的 sn-p 保持字符串不变。我怎么能强制它附加一个结束 &lt;/a&gt; 或至少完全剥离 &lt;a&gt;

【问题讨论】:

【参考方案1】:

您可以使用适当的 html 解析器来执行此操作。我推荐 Nokogiri 做这份工作:

require 'nokogiri'
# ...
s = "<a href='http://example.com'>incomplete"
Nokogiri::HTML::fragment(sanitize(s, :tags => ['a', 'p'])).to_xml
# => "<a href=\"http://example.com\">incomplete</a>"

这将始终返回有效的 XML。当然,您可以将其打包到您自己的辅助方法中以便于使用。

【讨论】:

谢谢,但我看到 TypeError: can't convert Symbol into Integer 对此作出回应,它适用于纯文本。这是 Nokogiri 1.5.2。 @mahemoff: Nokogiri::HTML::fragment("&lt;a href='http://example.com'&gt;incomplete").to_xml 在这里工作正常。您尝试的实际标签汤是什么? 实际上,它看起来像是要清理的第二个参数。与原始问题一样,允许的标签需要在散列中,键入:tags =>。 Nokogiri::HTML::fragment(sanitize('test &lt;a href="http://example.com"&gt;incomplete', :tags =&gt; ['a', 'p'])).to_xml 确实有效。 顺便说一句,我刚刚注意到,在处理 i18n 时,to_xml 可能比to_html 更好。后者正在转义像 这样的 unicode 实体。【参考方案2】:

更新后的答案是

 s = "<a href='http://example.com'>incomplete"
 html = sanitize(s, tags: %w[a p])
 Nokogiri::HTML::DocumentFragment.parse(html).to_html

【讨论】:

最后一行对我来说效果很好,也关闭了未关闭的标签。

以上是关于清理 HTML 并关闭不完整的标签的主要内容,如果未能解决你的问题,请参考以下文章

Bleach:Mozilla 出品,快速准确地清理 HTML

如何使用基于标签的 XML::Twig 解析器在 Unix 上清理 xml 文件 [关闭]

清理 HTML 标签属性

没有完整的项目清理,不会应用 XML 布局更改

Teleport Ultra/Teleport Pro的冗余代码批量清理方法

清理丑陋的所见即所得 HTML 代码? Python 或 *nix 实用程序