gpt4 book ai didi

java - 仅在文本部分用 jsoup 替换字符串

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:46 26 4
gpt4 key购买 nike

我发现了几个具有相似问题和有值(value)答案的主题,但我仍在为此苦苦挣扎:

我想用 Jsoup 解析一些 html,这样我就可以替换,例如,

"changeme"

<changed>changeme</changed>

,但仅当它出现在 html 的文本部分时,如果它是标记的一部分则否。所以,从这个 html 开始:

<body>
<p><a href="http://changeme.html">test changeme app</a></p>
</BODY>
</HTML>

我想说的是:

<body>
<p><a href="http://changeme.html">test <changed>changeme</changed> app</a></p>
</BODY>
</HTML>

我尝试了几种方法,这个方法让我更接近期望的结果:

Document doc = null;
try {
doc = Jsoup.parse(new File("tmp1450348256397.txt"), "UTF-8");
} catch (Exception ex) {
}

Elements els = doc.body().getAllElements();
for (Element e : els) {
if (e.text().contains("changeme")) {
e.html(e.html().replaceAll("changeme","<changed>changeme</changed>"));
}
}
html = doc.toString();
System.out.println(html);

但是使用这种方法我发现了两个问题:

<body>
<p><a href="http://<changed>changeme</changed> .html">test
<changed>
changeme
</changed>
app</a></p>
</BODY>
</HTML>
  1. 在我介绍的新元素前后插入换行符。这不是一个真正的问题,因为如果我使用#changed# 进行替换并且在 doc.toString() 之后我再次将它们替换为所需的值(使用 < >),我可以摆脱它们。

  2. 真正的问题:href 中的 URL 已被修改,我不希望它发生。

想法?谢谢。

最佳答案

这是我的解决方案:

String html=""
+"<p><a href=\"http://changeme.html\">"
+ "test changeme "
+ "<div class=\"changeme\">"
+ "inner text changeme"
+ "</div>"
+ " app</a>"
+"</p>";
Document doc = Jsoup.parse(html);
Elements els = doc.body().getAllElements();
for (Element e : els) {
List<TextNode> tnList = e.textNodes();
for (TextNode tn : tnList){
String orig = tn.text();
tn.text(orig.replaceAll("changeme","<changed>changeme</changed>"));
}
}

html = doc.toString();
System.out.println(html);

TextNodes 始终是叶节点,即它们不包含更多的 HTML 元素。在您原来的方法中,您将元素的 HTML 替换为新的 HTML 替换为 changme字符串。您只检查 changeme 是否是 TextNodes 内容的一部分,但您替换元素的 HTML 字符串中的每个匹配项,包括 TextNodes 之外的所有匹配项。

我的解决方案基本上和你的一样,但我使用 JSoup 方法 textNodes() .这样我就不需要进行类型转换。

附言当然,我的解决方案和你的解决方案都将包含 &lt;changed&gt;changeme&lt;/changed&gt;而不是 <changed>changeme</changed>到底。这可能是也可能不是您想要的。如果你不想要这个,那么你的结果将不再是有效的 HTML,因为 changed不是有效的 HTML 标记。在这种情况下,Jsoup 不会帮助你。但是,您当然可以在结果字符串中替换所有 &lt;changed&gt;changeme&lt;/changed&gt;再次 - 在 JSoup 之外。

关于java - 仅在文本部分用 jsoup 替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com