Удалить HTML-теги из строки
будет работать, но такие вещи, как & , не будут правильно преобразованы, а не HTML между двумя угловыми скобками будут удалены (т.е. .*? в регулярном выражении исчезнет).
27 ответов
Вместо регулярного выражения используйте парсер HTML. Это несложно с Jsoup.
public static String html2text(String html)
Jsoup также поддерживает удаление HTML-тэгов с настраиваемым «белым списком», что очень полезно, если вы хотите разрешить только, например, , и .
Смотрите также:
Jsoup хорош, но я столкнулся с некоторыми недостатками. Я использую его, чтобы избавиться от XSS, поэтому в основном я ожидаю ввода простого текста, но какой-то злой человек может попытаться отправить мне немного HTML. Используя Jsoup, я могу удалить весь HTML, но, к сожалению, он также сокращает много пробелов до одного и удаляет разрывы ссылок (\ n символов)
использование clean () все равно приведет к удалению лишних пробелов и символов \ n. например: Jsoup.clean («a \ n b», Whitelist.none ()) возвращает «a b»
@Keith: конечно лишние пробелы и \ n будут удалены, так как HTML игнорирует их, и вы вызываете .clean ()
Будет ли это выполнять «атрибут побега»? Я имею в виду правило № 2 в этом списке: owasp.org/index.php/…
@Nels: ты говоришь о Jsoup#clean() ? Определенно да. Нажмите ссылку «Jsoup # clean ()» в моем предыдущем комментарии.
@ Zeroows: это с треском проваливается на
Lorem ipsum 1 < 3 dolor sit amet
. Опять же, HTML не является обычным языком . Мне совершенно непонятно, почему все пытаются использовать регулярные выражения для анализа интересующих частей, вместо того, чтобы использовать настоящий анализатор.
использовать Jsoup.clean(unsafeString, «», Whitelist.none(), new OutputSettings().prettyPrint(false)); сохранить разрывы строк
Если вы пишете для Android, вы можете это сделать.
android.text.Html.fromHtml(instruction).toString()
Потрясающий совет. 🙂 Если вы отображаете текст в TextView, вы можете удалить .toString (), чтобы сохранить также некоторое форматирование.
Это хорошо, но теги заменены на некоторые странные вещи. Я получил маленькие квадраты, где было изображение
Если пользователь вводит hey! , вы хотите отобразить hey! или hey! ? Если первый, бежать менее-thans и html-encode амперсанды (и, возможно, кавычки), и все в порядке. Модификация вашего кода для реализации второго варианта:
но вы столкнетесь с проблемами, если пользователь вводит что-то неправильное, например .
Вы также можете проверить JTidy, который будет анализировать «грязный» html-ввод и должен дать вам способ удалить теги, сохраняя текст.
Проблема с попыткой разделить html заключается в том, что браузеры имеют очень мягкие парсеры, более мягкие, чем любая библиотека, которую вы можете найти, поэтому, даже если вы сделаете все возможное, чтобы удалить все теги (используя вышеперечисленный метод, библиотеку DOM, или JTidy), вам все равно нужно будет закодировать любые оставшиеся специальные символы HTML, чтобы обеспечить безопасность вывода.
Вы также сталкиваетесь с проблемами, если в содержимом html-узла есть неэкранированный знак <или>. Мой возраст — , тогда ваш возраст . Я думаю, что только 100% способ сделать это через некоторый интерфейс XML DOM (например, SAX или аналогичный), чтобы использовать node.getText ().или>
Другой способ — использовать javax.swing.text.html.HTMLEditorKit для извлечения текста.
import java.io.*; import javax.swing.text.html.*; import javax.swing.text.html.parser.*; public class Html2Text extends HTMLEditorKit.ParserCallback < StringBuffer s; public Html2Text() < >public void parse(Reader in) throws IOException < s = new StringBuffer(); ParserDelegator delegator = new ParserDelegator(); // the third parameter is TRUE to ignore charset directive delegator.parse(in, this, Boolean.TRUE); >public void handleText(char[] text, int pos) < s.append(text); >public String getText() < return s.toString(); >public static void main(String[] args) < try < // the HTML to convert FileReader in = new FileReader("java-new.html"); Html2Text parser = new Html2Text(); parser.parse(in); in.close(); System.out.println(parser.getText()); >catch (Exception e) < e.printStackTrace(); >> >
Я думаю, что самый простой способ фильтрации тегов html:
private static final Pattern REMOVE_TAGS = Pattern.compile("<.+?>"); public static String removeTags(String string) < if (string == null || string.length() == 0) < return string; >Matcher m = REMOVE_TAGS.matcher(string); return m.replaceAll(""); >
Также очень просто использовать Jericho, и вы можете сохранить некоторые форматирования (например, разрывы строк и ссылки).
Source htmlSource = new Source(htmlText); Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length()); Renderer htmlRend = new Renderer(htmlSeg); System.out.println(htmlRend.toString());
Иерихон работал как шарм. Спасибо за предложение. Одно замечание: вам не нужно создавать сегмент всей строки. Источник расширяет сегмент, поэтому либо работает в конструкторе рендерера.
Джерико теперь, кажется, немного устарел (последний выпуск был 3.4 в конце 2015 года). Однако, если это все еще работает хорошо, тогда это все еще работает хорошо!
На Android попробуйте следующее:
String result = Html.fromHtml(html).toString();
Вы всегда используете фрагменты кода для нормального кода. Отрывки кода должны использоваться только для HTML, javascript или другого кода, который можно запустить в браузере. Вы не можете запустить Java в браузере. В будущем используйте обычные блоки кода . Я отредактирую ваш ответ для вас на этот раз и исправлю форматирование и т. Д., Но, пожалуйста, не делайте этого больше в будущем. Это не первый раз, когда я рассказываю тебе об этом .
хорошо работает для меня, парень, может быть, вы должны проверить свои данные, как это происходит с любым пустым пространством, как это ..
HTML Escaping действительно сложно сделать правильно — я бы определенно предложил использовать библиотечный код для этого, так как он намного более тонкий, чем вы думаете. Проверьте Apache StringEscapeUtils для довольно хорошей библиотеки для обработки этого в Java.
Вы хотите удалить HTML или конвертировать его в обычный текст? Вырезание HTML из длинной строки с тегами br и сущностями HTML может привести к неразборчивому беспорядку.
Принятый ответ просто Jsoup.parse(html).text() имеет 2 потенциальных проблемы (с JSoup 1.7.3):
Если вы используете это для защиты от XSS, это немного раздражает. Вот мой лучший снимок в улучшенном решении, используя как JSoup, так и Apache StringEscapeUtils:
// breaks multi-level of escaping, preventing <script> to be rendered as String replace = input.replace("&", ""); // decode any encoded html, preventing <script> to be rendered as String html = StringEscapeUtils.unescapeHtml(replace); // remove all html tags, but maintain line breaks String clean = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false)); // decode html again to convert character entities back into text return StringEscapeUtils.unescapeHtml(clean);
Обратите внимание, что последний шаг заключается в том, что мне нужно использовать вывод как обычный текст. Если вам нужен только вывод HTML, вы можете удалить его.
И вот куча тестовых примеров (вход для вывода):
Если вы найдете способ сделать это лучше, сообщите мне.
Это не удастся <script>alert(‘Evil script executed’);</script> например, <script>alert(‘Evil script executed’);</script> , То же самое касается & , JSoup не конвертирует <script> into
Возможно, вы захотите заменить теги
и
символами новой строки перед тем, как удалить HTML-код, чтобы он не стал неразборчивым, как предполагает Тим.
Единственный способ, я могу думать об удалении тегов HTML, но оставляя не-HTML между угловыми скобками, будет проверяться на список тегов HTML. Что-то в этом роде.
Затем специальные символы HTML-декодирования, такие как & . Результат не следует считать дезинфицированным.
text.replaceAll('<.*?>' , " ") -> This will replace all the html tags with a space.
text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like , &, > etc.
Используйте Html.fromHtml
, , ,
, , , , , , , , , ,, , , , , ,
В соответствии с Официальные документы андроидов любые теги в HTML будут отображаться как родовая замена Строка, которую ваша программа может выполнить и заменить с помощью реальных строк.
Html.formHtml использует Html.TagHandler и Html.ImageGetter как аргументы, а также текст для разбора.
Пример
String Str_Html=" This is about me text that the user can put into their profile
";
Your_TextView_Obj.setText(Html.fromHtml(Str_Html).toString());
Это текст обо мне, который пользователь может ввести в свой профиль
Принятый ответ не помог мне для тестового примера, который я указал: результатом «a < b или b >c» является «a b или b > c».
Итак, вместо этого я использовал TagSoup. Вот выстрел, который работал на мой тестовый пример (и несколько других):
import java.io.IOException; import java.io.StringReader; import java.util.logging.Logger; import org.ccil.cowan.tagsoup.Parser; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; /** * Take HTML and give back the text part while dropping the HTML tags. * * There is some risk that using TagSoup means we'll permute non-HTML text. * However, it seems to work the best so far in test cases. * * @author dan * @see TagSoup */ public class Html2Text2 implements ContentHandler < private StringBuffer sb; public Html2Text2() < >public void parse(String str) throws IOException, SAXException < XMLReader reader = new Parser(); reader.setContentHandler(this); sb = new StringBuffer(); reader.parse(new InputSource(new StringReader(str))); >public String getText() < return sb.toString(); >@Override public void characters(char[] ch, int start, int length) throws SAXException < for (int idx = 0; idx < length; idx++) < sb.append(ch[idx+start]); >> @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException < sb.append(ch); >// The methods below do not contribute to the text @Override public void endDocument() throws SAXException < >@Override public void endElement(String uri, String localName, String qName) throws SAXException < >@Override public void endPrefixMapping(String prefix) throws SAXException < >@Override public void processingInstruction(String target, String data) throws SAXException < >@Override public void setDocumentLocator(Locator locator) < >@Override public void skippedEntity(String name) throws SAXException < >@Override public void startDocument() throws SAXException < >@Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException < >@Override public void startPrefixMapping(String prefix, String uri) throws SAXException < >>
Jsoup clean HTML example
Jsoup clean HTML example shows how to clean HTML using Jsoup. The example also shows how to remove HTML tags from String and retain specific tags using a whitelist while cleaning the HTML using Jsoup.
How to remove HTML tags by cleaning the HTML using Jsoup?
You can remove HTML tags from String using the clean method of the Jsoup.
This method removes all HTML tags from the HTML string while retaining the tags included in the specified whitelist. By default, Jsoup provides the below-given whitelists out of the box.
1) none
All HTML tags are removed except for the text nodes.
2) simpleText
This whitelist allows only text formatting HTML tags b, em, i, strong and u. All other tags are removed.
3) basic
Basic whitelist allows a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, span, strike, strong, sub, sup, u, ul tags. All other tags are removed. It does not allow images.
4) basicWithImages
As the name suggests, this whitelist allows all tags included in the basic whitelist plus image (img tag).
5) relaxed
This is the most accommodating whitelist which allows a, b, blockquote, br, caption, cite, code, col, colgroup, dd, div, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, span, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul tags.
How to clean HTML using a whitelist?
Create an appropriate whitelist object and use it along with the clean method to clean the HTML and retain tags specified in the whitelist as given below.