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('"', '"')) } } // 输出处理后的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 "tempor" invidunt ut labore et... </p>
兜底方案(不推荐)
如果受环境限制无法引入第三方库,可尝试正则匹配实现,但存在边界问题(如未闭合标签、特殊格式的属性值可能识别错误),仅可作为临时兜底:
def processedHtml = rawHtml.replaceAll(/(?<!<[^<>]*)\\"(?![^<>]*>)/, '"')
内容的提问来源于stack exchange,提问作者Windwalker
相关产品推荐
相关产品推荐

