Подтвердить что ты не робот

Как найти, если String содержит html-данные?

Как узнать, содержит ли строка данные HTML или нет? Пользователь предоставляет вход через веб-интерфейс, и вполне возможно, что он мог использовать либо простой текст, либо форматирование HTML.

4b9b3361

Ответ 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));
        }
    }