如何查找String是否包含html数据?

时间:2010-06-16 09:26:39

标签: java html

如何查找字符串是否包含HTML数据?用户通过Web界面提供输入,很可能他可以使用简单文本或使用HTML格式。

7 个答案:

答案 0 :(得分:17)

我知道这是一个老问题,但我遇到了它并且正在寻找更全面的东西,可以检测像HTML实体这样的东西,并且会忽略<的其他用途。和>符号。我想出了下面一个运作良好的课程。

您可以在http://ideone.com/HakdHo

直播

我还通过一系列JUnit测试将其上传到GitHub

package org.github;

/**
 * Detect HTML markup in a string
 * This will detect tags or entities
 *
 * @author dbennett455@gmail.com - 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;
    }

}

答案 1 :(得分:3)

您可以使用正则表达式搜索HTML标记。

答案 2 :(得分:3)

我正在使用正则表达式:

  

[\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]*");

它应该匹配任何包含某个“html”元素的正确(以及一些不正确的)XML文件。所以可能存在误报。

修改

由于我已发布,我已删除了html元素关闭的最后一部分,因为我发现一些网站不使用它。 (?!)所以万一,你更喜欢误报的误报,我鼓励这样做!

答案 3 :(得分:2)

在您的支持bean中,您可以尝试查找html标记,例如<b><i>等... 你可以使用正则表达式(慢)或只是尝试找到“&lt;&gt;”字符。这取决于用户使用html的确定程度。

请记住,用户可以写<asdf>。如果你想100%确定使用的html是有效的,你需要使用某个库中的复杂html解析器(可能是TidyHTML?)

答案 4 :(得分:2)

如果您不希望用户在其输入中包含HTML,则可以替换所有“&lt;”与HTML实体等效的字符,'&amp; LT;”和所有'&gt;'与'&amp; GT;” (&amp;和g之间没有空格)

答案 5 :(得分:1)

下面将匹配任何标签。您还可以提取标签,属性和值

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

答案 6 :(得分:0)

您必须仅通过正则表达式字符串获得帮助。它们可以帮助您找到潜在的HTML标签。然后,您可以比较内部以包含任何html关键字。如果找到它,请提示不要使用HTML。或者,如果您不这么想,只需将其删除即可。