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

Ruby中如何部分转义HTML(不转义HTML标签)

处理混合HTML标签的字符串转义方案

核心需求

需要处理三类字符串:

  • 含原生特殊字符(如单引号)的普通字符串
  • 含HTML实体(如')的字符串
  • 混合HTML标签与内容的字符串

要求仅转义文本内容中的特殊字符,保留HTML标签结构不被转义,同时统一处理三类字符串的格式一致性。

问题分析

之前使用的CGI.escapeHTML(CGI.unescapeHTML(str))会将整个字符串视为纯文本,导致HTML标签中的<、>等符号被转义成实体,破坏标签结构。

解决方案:基于HTML解析器的节点级处理

使用HTML解析库(如Ruby的Nokogiri)区分HTML标签与文本节点,仅对文本内容进行转义处理,保留标签完整性。

实现步骤

  1. 将输入字符串解析为HTML片段,自动识别标签与文本节点
  2. 遍历所有文本节点:先解码已有的HTML实体,再转义特殊字符
  3. 输出处理后的完整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&#39;t help.",
  "We couldn&#39;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&#39;t help
We couldn&#39;t help.
We couldn&#39;t help. Check <a href="https://www.google.com">link</a> for help

说明

  • Nokogiri会自动保留HTML标签的结构,仅修改文本内容部分
  • 先解码再转义的逻辑,确保原生特殊字符和已存在的HTML实体都能被统一处理为标准实体格式
  • 兼容所有HTML标签类型,不受标签属性或结构影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:30:56