Unescapes строка, содержащая сущность, экранируется в строку, содержащую фактические символы Unicode, соответствующие экранированию. Поддерживает сущности HTML 4.0.
К сожалению, я только сегодня понял, что он не очень хорошо декодирует специальные символы HTML :(
Sid
1
грязный трюк состоит в том, чтобы сначала сохранить значение в скрытом поле, чтобы избежать его, затем целевое поле должно получить значение из скрытого поля.
Я хочу преобразовать строку <p>üè</p>в <p>üé</p>, с StringEscapeUtils.unescapeHtml4()я получаю <p>üè</p>. Есть ли способ сохранить существующие HTML-теги без изменений?
Nickkk
48
Библиотеки, упомянутые в других ответах, были бы хорошими решениями, но если вам уже приходилось копаться в реальных html-кодах в вашем проекте, Jsoupпроект может предложить гораздо больше, чем просто управлять «точками с запятой» .
// textValue: <p>This is a sample. \"Granny\" Smith –.<\/p>\r\n// becomes this: This is a sample. "Granny" Smith –.// with one line of code:// Jsoup.parse(textValue).getText(); // for older versions of JsoupJsoup.parse(textValue).text();// Another possibility may be the static unescapeEntities method:boolean strictMode =true;String unescapedString = org.jsoup.parser.Parser.unescapeEntities(textValue, strictMode);
Кроме того, вы получаете удобный API для извлечения и обработки данных, используя лучшие методы DOM, CSS и jquery-подобные. Это лицензия с открытым исходным кодом и MIT.
upvote +, но я должен указать, что более новые версии Jsoup используют .text()вместо.getText()
SourceVisor
4
Возможно, более прямым является использование org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute). API Docs: jsoup.org/apidocs/org/jsoup/parser/...
danneu
3
Это было прекрасно, так как я уже использую Jsoup в своем проекте. Кроме того, @danneu был прав - Parser.unescapeEntities работает точно так, как рекламируется.
MandisaW
42
Я пробовал Apache Commons StringEscapeUtils.unescapeHtml3 () в своем проекте, но не был удовлетворен его производительностью. Оказывается, он делает много ненужных операций. Во-первых, он выделяет StringWriter для каждого вызова, даже если в строке ничего нет. Я переписал этот код по-другому, теперь он работает намного быстрее. Любой, кто найдет это в Google, может использовать его.
Следующий код удаляет все символы HTML 3 и числовые экранированные символы (эквивалент Apache unescapeHtml3). Вы можете просто добавить больше записей на карту, если вам нужен HTML 4.
Недавно мне пришлось оптимизировать медленный проект Struts. Оказалось, что под прикрытием Struts вызывает Apache для вывода html-строки по умолчанию ( <s:property value="..."/>). Отключение escaping ( <s:property value="..." escaping="false"/>) заставило некоторые страницы работать на 5-20% быстрее.
Стефан
Позже я узнал, что этот код может войти в цикл, когда в качестве аргумента указана пустая строка. В текущей версии эта проблема исправлена.
Ник Фролов
Это убегает или уходит? & Amp; не декодируется Только & добавляется на карту, так что это работает только в одну сторону?
ммм
3
Внутри StringWriter используется StringBuffer, который использует блокировку. Использование StringBuilder напрямую должно быть быстрее.
Аксель Дёрфлер
4
@NickFrolov, ваши комментарии кажутся немного запутанными. aumlнапример äи нет д.
aioobe
12
Следующая библиотека может также использоваться для экранирования HTML в Java: unbescape .
Он ничего не сделал для этого:%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
ThreaT
40
@ThreaT Ваш текст не в HTML-кодировке, а в URL-кодировании
Рассмотрите возможность использования Java-класса HtmlManipulator . Возможно, вам придется добавить некоторые элементы (не все объекты в списке).
Apache Commons StringEscapeUtils, предложенный Кевином Хакансоном, не работал для меня на 100%; несколько сущностей, таких как & # 145 (оставленная одинарная кавычка) были как-то переведены в '222'. Я также попробовал org.jsoup, и у меня была такая же проблема.
В моем случае я использую метод replace, проверяя каждую сущность в каждой переменной, мой код выглядит так:
text = text.replace("Ç","Ç");
text = text.replace("ç","ç");
text = text.replace("Á","Á");
text = text.replace("Â","Â");
text = text.replace("Ã","Ã");
text = text.replace("É","É");
text = text.replace("Ê","Ê");
text = text.replace("Í","Í");
text = text.replace("Ô","Ô");
text = text.replace("Õ","Õ");
text = text.replace("Ó","Ó");
text = text.replace("Ú","Ú");
text = text.replace("á","á");
text = text.replace("â","â");
text = text.replace("ã","ã");
text = text.replace("é","é");
text = text.replace("ê","ê");
text = text.replace("í","í");
text = text.replace("ô","ô");
text = text.replace("õ","õ");
text = text.replace("ó","ó");
text = text.replace("ú","ú");
Это не каждая особая сущность. Даже два упомянутых в вопросе отсутствуют.
Сэнди Гиффорд
это не будет хорошо масштабироваться
19
-7
Например, если вы хотите имитировать то, что делает функция php, htmlspecialchars_decode использует функцию php get_html_translation_table (), чтобы вывести таблицу и затем использовать код Java, например,
staticMap<String,String> html_specialchars_table =newHashtable<String,String>();static{
html_specialchars_table.put("<","<");
html_specialchars_table.put(">",">");
html_specialchars_table.put("&","&");}staticString htmlspecialchars_decode_ENT_NOQUOTES(String s){Enumeration en = html_specialchars_table.keys();while(en.hasMoreElements()){String key = en.nextElement();String val = html_specialchars_table.get(key);
s = s.replaceAll(key, val);}return s;}
Не бросай так много; используйте дженерики для этого HashMap! Кроме того, используйте foreach, а не время, чтобы повторить это, код будет выглядеть более читабельным!
WhyNotHugo
3
@BalaDutt, если вы улучшите свой ответ, ребята дадут вам очки :)
sparkyspider
3
@Bala, улучшайте также свои функции и имена переменных.
Ответы:
Я использовал Apache Commons StringEscapeUtils.unescapeHtml4 () для этого:
источник
<p>üè</p>
в<p>üé</p>
, сStringEscapeUtils.unescapeHtml4()
я получаю<p>üè</p>
. Есть ли способ сохранить существующие HTML-теги без изменений?Библиотеки, упомянутые в других ответах, были бы хорошими решениями, но если вам уже приходилось копаться в реальных html-кодах в вашем проекте,
Jsoup
проект может предложить гораздо больше, чем просто управлять «точками с запятой» .Кроме того, вы получаете удобный API для извлечения и обработки данных, используя лучшие методы DOM, CSS и jquery-подобные. Это лицензия с открытым исходным кодом и MIT.
источник
.text()
вместо.getText()
org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute)
. API Docs: jsoup.org/apidocs/org/jsoup/parser/...Я пробовал Apache Commons StringEscapeUtils.unescapeHtml3 () в своем проекте, но не был удовлетворен его производительностью. Оказывается, он делает много ненужных операций. Во-первых, он выделяет StringWriter для каждого вызова, даже если в строке ничего нет. Я переписал этот код по-другому, теперь он работает намного быстрее. Любой, кто найдет это в Google, может использовать его.
Следующий код удаляет все символы HTML 3 и числовые экранированные символы (эквивалент Apache unescapeHtml3). Вы можете просто добавить больше записей на карту, если вам нужен HTML 4.
источник
<s:property value="..."/>
). Отключение escaping (<s:property value="..." escaping="false"/>
) заставило некоторые страницы работать на 5-20% быстрее.auml
напримерä
и нетд
.Следующая библиотека может также использоваться для экранирования HTML в Java: unbescape .
HTML может быть удален следующим образом:
источник
%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
Это сделало работу для меня,
или
Я думаю, что всегда лучше использовать
lang3
по очевидным причинам. Надеюсь это поможет :)источник
Очень простое, но неэффективное решение без какой-либо внешней библиотеки:
Это следует использовать, только если у вас есть только небольшое количество строк для декодирования.
источник
Самый надежный способ с
от
org.apache.commons.lang3.StringEscapeUtils
.И чтобы избежать пробелов
Это гарантирует, что пробелы из-за копирования и вставки в веб-формах не будут сохраняться в БД.
источник
Spring Framework HtmlUtils
Если вы уже используете Spring Framework, используйте следующий метод:
источник
Рассмотрите возможность использования Java-класса HtmlManipulator . Возможно, вам придется добавить некоторые элементы (не все объекты в списке).
Apache Commons StringEscapeUtils, предложенный Кевином Хакансоном, не работал для меня на 100%; несколько сущностей, таких как & # 145 (оставленная одинарная кавычка) были как-то переведены в '222'. Я также попробовал org.jsoup, и у меня была такая же проблема.
источник
В моем случае я использую метод replace, проверяя каждую сущность в каждой переменной, мой код выглядит так:
В моем случае это сработало очень хорошо.
источник
Например, если вы хотите имитировать то, что делает функция php, htmlspecialchars_decode использует функцию php get_html_translation_table (), чтобы вывести таблицу и затем использовать код Java, например,
источник