我正在寻找Java解决方案,用给定HTML字符串中所有多行文本字段中的String str = "sysparm_type=list_data&count=20&start=0&p=incident%3Bq%3Aactive%3Dtrue%5Epriority%3D1%5EEQ&table=incident";
List<NameValuePair> pairs = URLEncodedUtils.parse(str, StandardCharsets.UTF8)
for (NameValuePair pair : pairs)
if (pair.getName().equals("priority"))
return; // do nothing
标记替换换行符,未包含在任何标记中一个想象的根)。
源数据是通过前端HTML编辑器(如TinyMCE)创建的HTML格式文本。所以它是一个任意的HTML片段 - 不存在的<br/>
的一部分。
以下内容:
<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>
答案 0 :(得分:1)
所以它比我在评论中所说的要复杂一点,但我觉得这样的事情可能有用:
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
进行替换,然后将它们重新组合在一起。我不是百分百肯定这会按原样运作,因为我现在无法测试它。但希望它可以解决这个问题。
我在评论中说的内容不起作用,因为您必须能够将子元素放回到文本之间。如果您只使用getOwnText()
,则无法执行此操作。
我自己并没有使用Jsoup,所以如果有人有任何改进,欢迎改进。
答案 1 :(得分:1)
这是我开始工作的方式(极关闭to the accepted answer)
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.parser.Parser;
public class HtmlText {
public static void main(String[] args) {
String test = "text1\ntext2<tag>tagged text \n tagged continue</tag> \ntext3";
System.out.println("-----=============----------");
System.out.println(test);
System.out.println("-----=============----------");
System.out.println(ReplaceWithSoup(test));
}
private static String ReplaceWithSoup(String source) {
StringBuilder sbResult = new StringBuilder();
Document doc = Jsoup.parseBodyFragment(source);
Element body = doc.body();
for(Node node: body.childNodes()) {
if(node instanceof TextNode) {
TextNode tn = (TextNode) node;
tn.text(tn.getWholeText().replace("\n","<br/>"));
}
sbResult.append(Parser.unescapeEntities(node.toString(), true));
}
return sbResult.toString();
}
}