【问题标题】:How to find if String contains html data?如何查找String是否包含html数据?
【发布时间】:2011-03-04 09:11:13
【问题描述】:

如何判断一个字符串是否包含 HTML 数据?用户通过网络界面提供输入,他很可能使用简单的文本或 HTML 格式。

【问题讨论】:

标签: java html


【解决方案1】:

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

【讨论】:

  • 啊,老问题#2。 Tom 是对的,正则表达式是完成工作的最直接方法,而且网上通常有很多示例可以帮助您进行操作。
  • @Alex Larzelere:问题 #2?你可以解释吗?这是一个 xkcd 参考(“现在你有两个问题”),还是别的什么?
  • @Cperkins 就是这样。老问题 #2,问题 #1 当然是您最初尝试做的任何事情。
【解决方案2】:

在你的backing bean中,你可以尝试找到html标签,如<b><i>等... 您可以使用正则表达式(慢)或尝试查找“”字符。这取决于您对用户是否使用 html 的确定程度。

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

【讨论】:

    【解决方案3】:

    您只能通过正则表达式字符串获得帮助。它们可以帮助您找出潜在的 html 标签。然后,您可以比较内部以包含任何 html 关键字。如果找到,请发出警告,告诉您不要使用 HTML。或者,如果您觉得不合适,直接将其删除。

    【讨论】:

      【解决方案4】:

      如果您不希望用户在其输入中包含 HTML,则可以将所有“' (& 和 g 之间没有空格)

      【讨论】:

        【解决方案5】:

        我知道这是一个老问题,但我遇到了它并正在寻找更全面的东西,可以检测 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;
            }
        
        }
        

        【讨论】:

          【解决方案6】:

          我正在使用正则表达式:

          [\S\s]*\&lt;html[\S\s]*\&gt;[\S\s]*\&lt;\/html[\S\s]*\&gt;[\S\s]*

          所以在 JAVA 中它看起来像:

          text.matches("[\\S\\s]*\\&lt;html[\\S\\s]*\&gt;[\\S\\s]*\\&lt;\\/html[\\S\\s]*\\&gt;[\S\s]*");

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

          编辑:

          自从我发布后,我已经删除了最后一部分关闭 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));
                    }
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-13
              • 2022-01-09
              • 1970-01-01
              相关资源
              最近更新 更多