在解析 HTML 字符串时保留非 html 标记

Posted

技术标签:

【中文标题】在解析 HTML 字符串时保留非 html 标记【英文标题】:Preserve non-html tags while parsing the HTML string 【发布时间】:2021-07-08 15:20:48 【问题描述】:

我一直在一个项目中工作,用户需要功能来解析保存在数据库中的 html 数据。我使用 <div> 和 JSOUP 将值解析为 HTML,例如:- <b>"Test"</b> 。它可以正常显示 - "Test" 该特定 HTML 格式的文本。但是当标签内的文本被删除时,问题就出现了。例如,当我有尖括号 时,文本会从 JSOUP <b>"Test 1 s< a test test 1<,tasa>"</b>

中转义

我得到结果

" 测试 1 秒

其他文本被删除。我需要显示整个

"Test 1 s".

任何帮助将不胜感激。

这是我的代码

def html = URLDecoder.decode(testValue.getAt('Test').replaceAll("%(?![0-9a-fA-F]2)", "%25"),"UTF-8")
Jsoup.clean(html, Whitelist.basic())

【问题讨论】:

要求并不完全清楚。你想如何处理像<b>How should <foo>this</foo> behave</b> 这样的事情? 根据html规则<如果是文本而不是标签的开头,则必须表示为< @JeffScottBrown 简而言之,我希望在 html 解析期间避免使用非 html 标签。如果未在白名单中提及,Jsoup 功能似乎正在删除任何出现的标签。如果在 jsoup 中有任何其他这样的属性,那就太好了,但是我找不到任何这样的方法,如果我得到任何这样的方法来解析唯一的 html 标签,避免使用尖括号等其他非 html 标签,那将非常有帮助. @daggett 是的,但是使用正则表达式来替换所有此类事件似乎非常烦人和错误。 你想用 replaceAll 做什么? 【参考方案1】:

已更新根据 cmets 支持一级嵌套元素

要支持递归嵌套元素,必须审查代码

时髦的:

@Grab(group='org.jsoup', module='jsoup', version='1.11.3')
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.TextNode

def html = '''
<html>
<title>my title</title>
<body>
<b>Test 1 s< a test test 1<,tasa> <foo>this</foo> zzz</b>
</body>
</html>'''

Document doc = Jsoup.parse(html)
def txt = doc.select('html body b').first()?.childNodes()
             .collecte-> e instanceof TextNode ? e.text() : e.toString() .join()

println txt

打印

Test 1 s< a test test 1<,tasa> <foo>
 this
</foo> zzz

【讨论】:

在上面的评论中,@noobCoder 表示他们希望防止&lt;foo&gt;&lt;b&gt;How should &lt;foo&gt;this&lt;/foo&gt; behave&lt;/b&gt; 之类的输入擦除。上面的解决方案没有考虑到这一点。 仅供参考...自从我留下之前的评论后,此答案已更改。 正确。喜欢问题下的评论) “对。就像问题下的评论” - 我的评论是为了后来读者的利益,因为我的声明因编辑而变得不正确。我不是在批评编辑。 更新了答案以明确。我希望人们明白这个世界上的一切都是不同步的)

以上是关于在解析 HTML 字符串时保留非 html 标记的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 解析 HTML 标签

1python基础语法

1python基础语法

从字符串中删除 HTML 标记并保留“:”(冒号)[重复]

python基础语法

替换字符串中的 html 标记,但保留文本并用自定义标记重新换行