使用Rails::Html::TargetScrubber过滤mailto链接并保留其他a标签
完整实现代码
你可以直接替换你的自定义Scrubber代码为以下内容:
class TargetedHtmlScrubber < Rails::Html::TargetScrubber def initialize super self.tags = %w[a] end def allowed_node?(node) # 识别mailto开头的链接 href = node['href']&.downcase # 非mailto开头的a标签允许保留 !href&.start_with?('mailto:') end def scrub_attribute?(name) # 不需要清理a标签的任何属性,全部保留 false end end
逻辑说明
- 你之前所有a标签都被清理的原因是
allowed_node?方法没有返回有效值,默认判定为不允许节点存在,所以所有a标签都被剥离。 allowed_node?方法返回true时对应节点会被完整保留,返回false时节点标签会被剥离,仅保留内部文本内容。我们在方法内判断a标签的href属性是否以mailto:开头,是则返回false剥离标签,否则返回true保留标签。scrub_attribute?方法返回true时对应属性会被删除,返回false时属性保留。我们不需要过滤a标签的属性,因此统一返回false即可。
该实现可以直接通过你给出的两组测试用例,普通http/https等协议的a标签会完整保留,mailto协议的a标签会被剥离仅保留文本。
内容的提问来源于stack exchange,提问作者Rimian
相关产品推荐
相关产品推荐

