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
相关产品推荐
相关产品推荐

