You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中如何去除HTML的标签和样式规则 能否通过sanitize实现?

问题原因

你当前遇到的样式规则残留问题,是因为Rails的sanitize方法默认使用的PermitScrubber逻辑为:仅剥离不在允许标签列表中的标签本身,保留标签内部的文本和子节点。你给出的示例中style标签不在允许列表内,所以标签被移除,但内部的CSS文本被保留了下来。

解决方案

不需要额外引入Nokogiri等第三方工具,用Rails自带的sanitize自定义scrubber即可实现需求,有两种常用实现方式:

方式1:使用块形式的简易自定义scrubber

直接在调用sanitize时传入块,匹配到style标签直接删除整个节点(包含内部内容):

result = ActionController::Base.helpers.sanitize(
  "<style> .emphasized { font-weight: bold } </style> hey <div class='emphasized'>watch out</div>",
  tags: %w(strong b br p ul li em u)
) do |node|
  # 匹配style标签直接移除整个节点
  node.remove if node.name == 'style'
end

# 输出结果:" hey watch out"

方式2:封装自定义scrubber类

如果需要在多处复用这个过滤规则,可以封装成独立的scrubber类:

# 放在 app/scrubbers/style_remove_scrubber.rb
class StyleRemoveScrubber < Rails::Html::PermitScrubber
  def initialize
    super
    # 全局配置允许的标签列表
    self.tags = %w(strong b br p ul li em u)
  end

  def scrub_node(node)
    # 遇到style标签直接删除整个节点,终止该节点后续处理
    if node.name == 'style'
      node.remove
      return STOP
    end
    super
  end
end

# 调用方法
scrubber = StyleRemoveScrubber.new
result = ActionController::Base.helpers.sanitize(
  "<style> .emphasized { font-weight: bold } </style> hey <div class='emphasized'>watch out</div>",
  scrubber: scrubber
)

内容的提问来源于stack exchange,提问作者ibpix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:06:01