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

Groovy/Java如何仅转义HTML innerText内的双引号而非属性内的双引号

解决方案

核心思路是避免直接对HTML字符串做全局替换,通过解析HTML为DOM结构,仅对纯文本节点内的双引号做转义,既不会误伤HTML属性的双引号,也能兼容各种复杂的富文本结构。

推荐使用Java/Groovy生态成熟的HTML解析库jsoup实现,具体代码如下:

步骤1:引入依赖(可选,若项目已内置jsoup可跳过)

Groovy环境可直接用Grape引入:

@Grab('org.jsoup:jsoup:1.17.2')
import org.jsoup.Jsoup
import org.jsoup.nodes.TextNode

步骤2:具体处理逻辑

// 待处理的原始富文本
def rawHtml = '''<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
    <span style="text-decoration: underline;">
        sed diam nonumy
    </span> eirmod "tempor" invidunt ut labore et...
</p>'''

// 解析HTML片段,保留原有标签、属性、格式
def doc = Jsoup.parseBodyFragment(rawHtml)

// 遍历所有文本节点,仅转义文本内的双引号
doc.select("*").each { element ->
    element.textNodes().each { TextNode node ->
        node.text(node.text().replace('"', '&quot;'))
    }
}

// 输出处理后的HTML片段,无多余外层标签
def processedHtml = doc.body().html()

处理结果示例

处理后仅文本内的双引号被转义,属性的双引号完全保留:

<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
    <span style="text-decoration: underline;">
        sed diam nonumy
    </span> eirmod &quot;tempor&quot; invidunt ut labore et...
</p>

兜底方案(不推荐)

如果受环境限制无法引入第三方库,可尝试正则匹配实现,但存在边界问题(如未闭合标签、特殊格式的属性值可能识别错误),仅可作为临时兜底:

def processedHtml = rawHtml.replaceAll(/(?<!<[^<>]*)\\"(?![^<>]*>)/, '&quot;')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:54:08