Регулярное выделение тегов HTML

У меня есть этот ввод HTML:

some text

another text

Я хотел бы использовать регулярное выражение для удаления тегов HTML, чтобы выход:

 some text another text 

Может ли кто-нибудь предложить, как это сделать с помощью регулярного выражения?

Вы можете пойти с парсером HTML под парсером Jericho Html.

вы можете скачать его здесь – http://jericho.htmlparser.net/docs/index.html

Иерихон HTML Parser – это Java-библиотека, позволяющая анализировать и обрабатывать части HTML-документа, включая tags на стороне сервера, при одновременном воспроизведении дословно любого нераспознанного или недопустимого HTML. Он также обеспечивает высокоуровневые функции обработки формы HTML.

Наличие плохо отформатированного HTML не мешает синтаксическому анализу

Поскольку вы спросили, вот быстрое и грязное решение:

 String stripped = input.replaceAll("< [^>]*>", ""); 

( Демонстрация Ideone.com )

Однако использование регулярных выражений для работы с HTML – довольно плохая идея. Вышеупомянутый взлом не будет иметь дело с такими вещами, как

  • Hello

и т.п.

Лучшим подходом было бы использование, например, Jsoup . Чтобы удалить все tags из строки, вы можете, например, выполнить Jsoup.parse(html).text() .

Используйте парсер HTML. Вот пример Jsoup .

 String input = "

some text

\n

another text

"; String stripped = Jsoup.parse(input).text(); System.out.println(stripped);

Результат:

  текст другого текста 

Или если вы хотите сохранить новые строки:

 String input = "

some text

\n

another text

"; for (String line : input.split("\n")) { String stripped = Jsoup.parse(line).text(); System.out.println(stripped); }

Результат:

 какой-то текст
 другой текст

Jsoup предлагает больше преимуществ. Вы можете легко извлечь определенные части документа HTML с помощью метода select() который принимает jQuery-подобные CSS-селектора. Это требует, чтобы документ был семантически хорошо сформирован. Наличие признанного с 1998 года уже не очень хорошим показателем, но если вы заранее знаете структуру HTML подробно, это все равно выполнимо.

Смотрите также:

  • Плюсы и минусы ведущих парсеров HTML в Java

Начиная с кода aioobe, я попробовал что-то более смелое:

 String input = "

some text

\n

another text

"; String stripped = input.replaceAll("", ""); System.out.println(stripped);

Код для разметки каждого тега HTML будет выглядеть так:

 public class HtmlSanitizer { private static String pattern; private final static String [] tagsTab = {"!doctype","a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","bgsound","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","isindex","kbd","keygen","label","legend","li","link","listing","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","plaintext","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr","xmp"}; static { StringBuffer tags = new StringBuffer(); for (int i=0;i"; } public static String sanitize(String input) { return input.replaceAll(pattern, ""); } public final static void main(String[] args) { System.out.println(HtmlSanitizer.pattern); System.out.println(HtmlSanitizer.sanitize("

some text


another text

")); } }
к public class HtmlSanitizer { private static String pattern; private final static String [] tagsTab = {"!doctype","a","abbr","acronym","address","applet","area","article","aside","audio","b","base","basefont","bdi","bdo","bgsound","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","isindex","kbd","keygen","label","legend","li","link","listing","main","map","mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes","noscript","object","ol","optgroup","option","output","p","param","plaintext","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","tt","u","ul","var","video","wbr","xmp"}; static { StringBuffer tags = new StringBuffer(); for (int i=0;i"; } public static String sanitize(String input) { return input.replaceAll(pattern, ""); } public final static void main(String[] args) { System.out.println(HtmlSanitizer.pattern); System.out.println(HtmlSanitizer.sanitize("

some text


another text

")); } }

Я написал это для того, чтобы быть совместимым с Java 1.4, по некоторым грустным причинам, поэтому не стесняйтесь использовать для каждого и StringBuilder …

Преимущества:

  • Вы можете создавать списки тегов, которые хотите разбить, что означает, что вы можете сохранить те, которые хотите
  • Вы избегаете удаления материала, который не является тегом HTML
  • Вы сохраняете пробелы

Недостатки:

  • Вы должны перечислить все tags HTML, которые вы хотите удалить из своей строки. Что может быть много, например, если вы хотите все разбить.

Если вы увидите другие недостатки, я действительно буду рад их узнать.

Если вы используете Иерихон , вам просто нужно использовать что-то вроде этого:

 public String extractAllText(String htmlText){ Source source = new Source(htmlText); return source.getTextExtractor().toString(); } 

Конечно, вы можете сделать то же самое даже с Element :

 for (Element link : links) { System.out.println(link.getTextExtractor().toString()); }