конвертировать разрывы и разрывы абзаца в новую строку в Java - PullRequest
5 голосов
/ 28 июня 2010

В основном у меня есть фрагмент HTML с <br> и <p></p> внутри. Мне удалось удалить все теги HTML, но при этом текст в плохом формате.

Я хочу что-то вроде nl2br() в PHP за исключением обратного ввода и вывода, а также учитывает теги <p>. есть ли для него библиотека на Java?

Ответы [ 3 ]

12 голосов
/ 28 июня 2010

Вам необходимо заменить <br> на \n и <p> на \n\n.Таким образом, в местах, где вам удастся удалить их, вам нужно вставить \n и \n\n соответственно.

Вот пример с помощью анализатора HTML Jsoup (пример HTML специально написан таким образом, что трудно, если не почти невозможно, использовать для этого регулярное выражение.

public static void main(String[] args) throws Exception {
    String originalHtml = "<p>p1l1<br/><!--</p>-->p1l2<br><!--<p>--></br><p id=p>p2l1<br class=b>p2l2</p>";
    String text = br2nl(originalHtml);
    String newHtml = nl2br(text);

    System.out.println("-------------");
    System.out.println(text);
    System.out.println("-------------");
    System.out.println(newHtml);
}

public static String br2nl(String html) {
    Document document = Jsoup.parse(html);
    document.select("br").append("\\n");
    document.select("p").prepend("\\n\\n");
    return document.text().replace("\\n", "\n");
}

public static String nl2br(String text) {
    return text.replace("\n\n", "<p>").replace("\n", "<br>");
}

(примечание: replaceAll() не нужно, так как нам нужна простая последовательность символовзамена by-charsequence здесь, а не regexpattern-by-charsequence замена)

Вывод:

<p>p1l1<br/><!--</p>-->p1l2<br><!--<p>--></br><p id=p>p2l1<br class=b>p2l2</p>
-------------


p1l1 
p1l2 



p2l1 
p2l2
-------------
<p>p1l1 <br>p1l2 <br> <br> <p>p2l1 <br>p2l2

Немного хак, но это работает.

3 голосов
/ 28 июня 2010

br2nl и p2nl не слишком сложны.Попробуйте:

String plain = htmlText.replaceAll("<br>","\\n").replaceAll("<p>","\\n\\n").replaceAll("</p>","");
1 голос
/ 28 июня 2010

Вы должны быть в состоянии использовать replaceAll. См. http://www.rgagnon.com/javadetails/java-0454.html для примера. Только 2 из них, один для р и один для бр. Пример идет другим путем, но вы можете изменить его, чтобы заменить html слешем n

...