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

时间:2015-10-08 15:33:28

标签: java html regex replaceall

我正在寻找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> 

2 个答案:

答案 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();
    }
}