Ruby中如何部分转义HTML(不转义HTML标签)
处理混合HTML标签的字符串转义方案
核心需求
需要处理三类字符串:
- 含原生特殊字符(如单引号)的普通字符串
- 含HTML实体(如
')的字符串 - 混合HTML标签与内容的字符串
要求仅转义文本内容中的特殊字符,保留HTML标签结构不被转义,同时统一处理三类字符串的格式一致性。
问题分析
之前使用的CGI.escapeHTML(CGI.unescapeHTML(str))会将整个字符串视为纯文本,导致HTML标签中的<、>等符号被转义成实体,破坏标签结构。
解决方案:基于HTML解析器的节点级处理
使用HTML解析库(如Ruby的Nokogiri)区分HTML标签与文本节点,仅对文本内容进行转义处理,保留标签完整性。
实现步骤
- 将输入字符串解析为HTML片段,自动识别标签与文本节点
- 遍历所有文本节点:先解码已有的HTML实体,再转义特殊字符
- 输出处理后的完整HTML字符串
Ruby代码示例
require 'cgi' require 'nokogiri' def safe_escape_html(str) # 解析为HTML片段,保留标签结构 doc = Nokogiri::HTML.fragment(str) # 遍历所有文本节点处理 doc.xpath('.//text()').each do |text_node| # 解码已有实体 → 转义特殊字符 decoded_content = CGI.unescapeHTML(text_node.content) escaped_content = CGI.escapeHTML(decoded_content) text_node.content = escaped_content end # 输出处理后的HTML doc.to_html end # 测试三类字符串 test_cases = [ "We couldn't help", "We couldn't help.", "We couldn't help. Check <a href = https://www.google.com>link</a> for help" ] test_cases.each do |test_str| puts safe_escape_html(test_str) end
输出结果
We couldn't help We couldn't help. We couldn't help. Check <a href="https://www.google.com">link</a> for help
说明
- Nokogiri会自动保留HTML标签的结构,仅修改文本内容部分
- 先解码再转义的逻辑,确保原生特殊字符和已存在的HTML实体都能被统一处理为标准实体格式
- 兼容所有HTML标签类型,不受标签属性或结构影响
内容的提问来源于stack exchange,提问作者elrond2194
相关产品推荐
相关产品推荐

