gpt4 book ai didi

java - 在未包含在标签中的多行文本节点中用
标签替换换行符

转载 作者:可可西里 更新时间:2023-11-01 13:29:01 26 4
gpt4 key购买 nike

我正在寻找用 <br/> 替换换行符的 Java 解决方案给定 HTML 字符串中所有多行文本字段中的标记,未包含在任何标记中(假想根的子项)。

源数据是通过前端 HTML 编辑器(如 TinyMCE)创建的 HTML 格式的文本。所以它是一个任意的 HTML 片段——不存在的 <body> 的一部分。 .

以下内容:

text11
text 21<p>tagged text1
tagged text2</p>
text 2

应该变成:

text11<br/>text 21<p>tagged text1
tagged text2</p></br>text 2

但是,以下内容完全不会受到影响:

<div>text11
text 21<p>tagged text1
tagged text2</p>
text 2</div>

我在想这样的事情(不工作):

private static String ReplaceLfWithBr(String source) {
// text - combination of words and line breaks
// should not be preceded by <tag> or followed by <\tag>
final String regex = "((?!<.+>)[\\w(\\r?\\n)]+(?!<\\s*/.+>))";
Pattern patern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher matcher = patern.matcher(source);
StringBuffer sb = new StringBuffer(source.length());
while(matcher.find()){
matcher.appendReplacement(sb, "<br/>");
}
matcher.appendTail(sb);
return sb.toString();
}

最佳答案

所以它比我在评论中所说的要复杂一些,但我认为这样的事情可能会奏效:

public static void main (String[] args)
{
String text = "text11\n"
+ "text 21<p>tagged text1\n"
+ "tagged text2</p>\n"
+ "text 2";

StringBuilder sb = new StringBuilder("<body>");
sb.append(text);
sb.append("</body>");
Document doc = Jsoup.parseBodyFragment(sb.toString());
Element body = doc.select("body");
List<Node> children = body.childNodes();
StringBuilder sb2 = new StringBuilder();
for(Node n : children) {
if(n instanceof TextNode) {
n.text(n.getWholeText().replace("\n", "<br/>"));
}
sb2.append(n.toString());
}
System.out.println(sb2.toString());
}

基本上获取所有的 Nodes,对 TextNodes 进行替换,然后将它们放回一起。我不是 100% 确定这会按原样工作,因为我目前无法对其进行测试。但希望它能传达这个想法。

我在评论中所说的不起作用,因为您必须能够将子元素放回文本之间的位置。如果您只使用 getOwnText(),则无法做到这一点。

我没用过Jsoup很多我自己,所以欢迎如果有人有任何改进。

关于java - 在未包含在标签中的多行文本节点中用 <br> 标签替换换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33020127/

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