it-swarm.com.ru

Как узнать, содержит ли String HTML-данные?

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

20
Joe

Вы можете использовать регулярные выражения для поиска тегов HTML.

3
Tom Gullen

Я знаю, что это старый вопрос, но я столкнулся с ним и искал что-то более всеобъемлющее, которое могло бы обнаружить такие вещи, как сущности 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;
    }

}
17
David H. Bennett

Я использую регулярное выражение:

[\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». Так что могут быть ложные срабатывания.

Правка:

После того, как я это опубликовал, я удалил последнюю часть с закрытием html-элемента, так как обнаружил, что некоторые веб-сайты не используют ее. (?!) Поэтому, если вы предпочитаете ложные срабатывания ложным негативам, я призываю это сделать!

3
Paweł Skorupiński

В вашем компоненте поддержки вы можете попытаться найти HTML-теги, такие как <b> или <i> и т.д. .... Вы можете использовать регулярные выражения (медленно) или просто попытаться найти символы "<>". Это зависит от того, насколько вы хотите, чтобы пользователь использовал HTML или нет.

Имейте в виду, что пользователь может написать <asdf>. Если вы хотите быть на 100% уверены, что используемый html действителен, вам нужно будет использовать сложный html-анализатор из какой-то библиотеки (возможно, TidyHTML?)

2
pakore

Если вы не хотите, чтобы пользователь вводил HTML, вы можете заменить все символы «<» на эквивалентные им объекты HTML, & lt; и все '>' с '& gt;' (без пробелов между & и g)

2
Tom Gullen

Ниже будут соответствовать любые теги. Вы также можете извлечь тег, атрибуты и значение

    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));
        }
    }
1
Gorky

Вы должны получить помощь только по строкам регулярного выражения. Они помогают вам узнать потенциальные HTML-теги. Затем вы можете сравнить внутреннее, чтобы содержать любые ключевые слова HTML. Если он найден, выведите предупреждение о том, что не следует использовать HTML. Или просто удалите его, если вы чувствуете иначе.

0
1s2a3n4j5e6e7v