【问题标题】:Sanitize HTML and close incomplete tags清理 HTML 并关闭不完整的标签
【发布时间】: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;

【问题讨论】:

    标签: html ruby-on-rails ruby ruby-on-rails-3.1 sanitize


    【解决方案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
    

    【讨论】:

    • 最后一行对我来说效果很好,也关闭了未关闭的标签。
    猜你喜欢
    • 2015-10-16
    • 2015-01-19
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多