Как узнать, содержит ли строка данные HTML или нет? Пользователь предоставляет вход через веб-интерфейс, и вполне возможно, что он мог использовать либо простой текст, либо форматирование HTML.
Как найти, если String содержит html-данные?
Ответ 1
Вы можете использовать регулярные выражения для поиска тегов HTML.
Ответ 2
Я знаю, что это старый вопрос, но я столкнулся с ним и искал что-то более всеобъемлющее, которое могло бы обнаружить такие вещи, как 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;
}
}
Ответ 3
В вашей поддержке bean вы можете попробовать найти теги html, такие как <b>
или <i>
и т.д....
Вы можете использовать регулярные выражения (медленные) или просто попытаться найти символы "< > ". Это зависит от того, насколько вы уверены, что пользователь использовал html или нет.
Имейте в виду, что пользователь мог написать <asdf>
. Если вы хотите быть на 100% уверенным, что используемый html действителен, вам нужно будет использовать сложный анализатор html из какой-либо библиотеки (возможно, TidyHTML?)
Ответ 4
Если вы не хотите, чтобы пользователь имел HTML-код на своем входе, вы можете заменить все '<' символы с их эквивалентом сущности HTML, '& л; "и все ' > ' с '& GT;" (без пробелов между и и g)
Ответ 5
Я использую 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, так как я обнаружил, что некоторые веб-сайты не используют его. (?!) Итак, в случае, если вы предпочитаете ложные срабатывания ложных негативов, я рекомендую это сделать!
Ответ 6
Вам нужно получить помощь только по строкам регулярных выражений. Они помогают вам узнать потенциальные теги html. Затем вы можете сравнить внутреннее содержимое с любыми ключевыми словами html. Если он найден, установите предупреждение, чтобы не использовать HTML. Или просто удалите его, если вы чувствуете обратное.
Ответ 7
Ниже будут соответствовать любые теги. Вы также можете извлечь теги, атрибуты и значение
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));
}
}