Вопрос-ответ

What is the recommended way to escape HTML symbols in plain Java?

Каков рекомендуемый способ экранирования HTML-символов в простой Java?

Существует ли рекомендуемый способ экранирования символов <, >, " и & при выводе HTML в простом коде Java? (То есть, кроме выполнения следующего вручную).

String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "&lt;").replace("&", "&amp;"); // ...
Переведено автоматически
Ответ 1

StringEscapeUtils От Apache Commons Lang:

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
// ...
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = escapeHtml(source);

Для версии 3:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
// ...
String escaped = escapeHtml4(source);
Ответ 2

Альтернатива Apache Commons: Используйте метод Spring HtmlUtils.htmlEscape(String input).

Ответ 3

Хороший короткий метод:

public static String escapeHTML(String s) {
StringBuilder out = new StringBuilder(Math.max(16, s.length()));
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c > 127 || c == '"' || c == '\'' || c == '<' || c == '>' || c == '&') {
out.append("&#");
out.append((int) c);
out.append(';');
} else {
out.append(c);
}
}
return out.toString();
}

На основе https://javalang.ru/a/8838023/1199155 (amp там отсутствует). Четыре символа, отмеченных в предложении if, являются единственными символами ниже 128, согласно http://www.w3.org/TR/html4/sgml/entities.html

Ответ 4

Существует более новая версия библиотеки Apache Commons Lang, и она использует другое имя пакета (org.apache.commons.lang3). В StringEscapeUtils теперь есть разные статические методы для экранирования различных типов документов (http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html). Итак, чтобы экранировать строку HTML версии 4.0:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;

String output = escapeHtml4("The less than sign (<) and ampersand (&) must be escaped before using them in HTML");
java