Ответ 1
Вы можете использовать регулярные выражения для поиска тегов HTML.
Как узнать, содержит ли строка данные HTML или нет? Пользователь предоставляет вход через веб-интерфейс, и вполне возможно, что он мог использовать либо простой текст, либо форматирование HTML.
Вы можете использовать регулярные выражения для поиска тегов HTML.
Я знаю, что это старый вопрос, но я столкнулся с ним и искал что-то более всеобъемлющее, которое могло бы обнаружить такие вещи, как HTML-сущности, и игнорирует другие применения < и > символов. Я придумал следующий класс, который хорошо работает.
Вы можете играть с ним в прямом эфире http://ideone.com/HakdHo
Я также добавил это в GitHub с кучей тестов JUnit.
package org.github;
/**
* Detect HTML markup in a string
* This will detect tags or entities
*
* @author [email protected] - David H. Bennett
*
*/
import java.util.regex.Pattern;
public class DetectHtml
{
// adapted from post by Phil Haack and modified to match better
public final static String tagStart=
"\\<\\w+((\\s+\\w+(\\s*\\=\\s*(?:\".*?\"|'.*?'|[^'\"\\>\\s]+))?)+\\s*|\\s*)\\>";
public final static String tagEnd=
"\\</\\w+\\>";
public final static String tagSelfClosing=
"\\<\\w+((\\s+\\w+(\\s*\\=\\s*(?:\".*?\"|'.*?'|[^'\"\\>\\s]+))?)+\\s*|\\s*)/\\>";
public final static String htmlEntity=
"&[a-zA-Z][a-zA-Z0-9]+;";
public final static Pattern htmlPattern=Pattern.compile(
"("+tagStart+".*"+tagEnd+")|("+tagSelfClosing+")|("+htmlEntity+")",
Pattern.DOTALL
);
/**
* Will return true if s contains HTML markup tags or entities.
*
* @param s String to test
* @return true if string contains HTML
*/
public static boolean isHtml(String s) {
boolean ret=false;
if (s != null) {
ret=htmlPattern.matcher(s).find();
}
return ret;
}
}
В вашей поддержке bean вы можете попробовать найти теги html, такие как <b>
или <i>
и т.д....
Вы можете использовать регулярные выражения (медленные) или просто попытаться найти символы "< > ". Это зависит от того, насколько вы уверены, что пользователь использовал html или нет.
Имейте в виду, что пользователь мог написать <asdf>
. Если вы хотите быть на 100% уверенным, что используемый html действителен, вам нужно будет использовать сложный анализатор html из какой-либо библиотеки (возможно, TidyHTML?)
Если вы не хотите, чтобы пользователь имел HTML-код на своем входе, вы можете заменить все '<' символы с их эквивалентом сущности HTML, '& л; "и все ' > ' с '& GT;" (без пробелов между и и g)
Я использую regex:
[\S\s]*\<html[\S\s]*\>[\S\s]*\<\/html[\S\s]*\>[\S\s]*
Итак, в JAVA это выглядит так:
text.matches("[\\S\\s]*\\<html[\\S\\s]*\>[\\S\\s]*\\<\\/html[\\S\\s]*\\>[\S\s]*");
Он должен соответствовать любому правильному (а также некорректному) XML файлу, который содержит где-то элемент "html". Таким образом, могут быть ложные срабатывания.
Edit:
Поскольку я опубликовал это, я удалил последнюю часть с закрытием элемента html, так как я обнаружил, что некоторые веб-сайты не используют его. (?!) Итак, в случае, если вы предпочитаете ложные срабатывания ложных негативов, я рекомендую это сделать!
Вам нужно получить помощь только по строкам регулярных выражений. Они помогают вам узнать потенциальные теги html. Затем вы можете сравнить внутреннее содержимое с любыми ключевыми словами html. Если он найден, установите предупреждение, чтобы не использовать HTML. Или просто удалите его, если вы чувствуете обратное.
Ниже будут соответствовать любые теги. Вы также можете извлечь теги, атрибуты и значение
Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))</\\1>");
Matcher matcher = pattern.matcher("<as testAttr='5'> TEST</as>");
if (matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
System.out.println(i + ":" + matcher.group(i));
}
}