2010-06-16 2 views
19

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

+0

Возможный дубликат [Как проверить, что строка не содержит HTML с помощью C#] (http://stackoverflow.com/questions/204646/how-to- validate-that-a-string-doesnt-содержать-html-using-c-sharp) – nullpointer

+0

OP хочет сделать это на Java, как это дубликат? –

ответ

4

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

+0

Ах, старая проблема # 2. Том прав, регулярное выражение - самый прямой способ выполнить задание, и, как правило, в Интернете есть много примеров, чтобы помочь вам начать работу. –

+0

@Alex Larzelere: проблема №2? Вы можете объяснить? Это ссылка xkcd («теперь у вас есть две проблемы») или что-то еще? – CPerkins

+0

@Cperkins, это точно. Ol 'проблема № 2, проблема № 1, конечно, это то, что вы пытались сделать изначально. –

2

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

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

0

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

2

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

14

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

} 
2

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

[\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, как я нашел некоторые веб-сайты не используют его. (?!) Итак, в случае, если вы предпочитаете ложные срабатывания ложных негативов, я призываю это сделать!

0

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

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)); 
     } 
    } 
Смежные вопросы