代码之家  ›  专栏  ›  技术社区  ›  thomax

Java正则表达式,用于匹配除特殊情况外的所有html元素

  •  2
  • thomax  · 技术社区  · 17 年前

    我有一个带有一些标记的字符串,看起来像这样:

    The quick brown <a href="www.fox.org">fox</a> jumped over the lazy <a href="entry://id=6000009">dog</a> <img src="dog.png" />.

    The quick brown fox jumped over the lazy <a href="entry://id=6000009">dog</a>.

    <.*?>!<a href=\"entry://id=\\d+\">.*?<\\/a>

    3 回复  |  直到 17 年前
        1
  •  7
  •   Brian Agnew    17 年前

    我真的不会使用正则表达式来解析HTML。HTML是不规则的,没有尽头的边缘情况会让你绊倒。

    结账 JTidy 相反。

        2
  •  1
  •   Tomalak    17 年前

    使用此:

    ((<a href="entry://id=\d+">.*?</a>)|<!\[CDATA\[.*?\]\]>|<!--.*?-->|<.*?>)
    

    将其与替换2美元相结合,适用于您的示例。下面的代码证明了这一点:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import static org.junit.Assert.*;
    import org.junit.Test;
    
    
    public class TestStack1305864 {
    
        @Test
        public void matcherWithCdataAndComments(){
            String s="The quick <span>brown</span> <a href=\"www.fox.org\">fox</a> jumped over the lazy <![CDATA[ > ]]> <a href=\"entry://id=6000009\">dog</a> <img src=\"dog.png\" />.";
            String r="The quick brown fox jumped over the lazy <a href=\"entry://id=6000009\">dog</a> .";
            String pattern="((<a href=\"entry://id=\\d+\">.*?</a>)|<!\\[CDATA\\[.*?\\]\\]>|<!--.*?-->|<.*?>)";
            Pattern p = Pattern.compile(pattern);
            Matcher m = p.matcher(s);
    
            String t = s.replaceAll(pattern, "$2");
            System.out.println(t);
            System.out.println(r);
            assertEquals(r, t);
        }
    }
    

    这个想法是捕获您感兴趣的所有元素,将其保存在特定组中,以便您可以将它们重新插入字符串中。

    对于与感兴趣的元素不匹配的每个元素,组将为空,元素将被替换为“”
    对于感兴趣的元素,组不会为空,并将附加到结果字符串中。

    编辑:处理嵌套<或>在CDATA和评论中
    http://martinfowler.com/bliki/ComposedRegex.html 用于正则表达式组合模式,旨在使正则表达式更易于维护。

        3
  •  1
  •   Jean    17 年前

    使用正则表达式不太可能。我推荐一个能够理解HTML/XML语义的解析器。

    坚持 ,你可以采取多步骤的方法,比如:

    • 替换 "<(a\s*href="entry:.*?/a)>" 随着 "{{{{\1}}}}"
    • 替换 "<(?!/a}}}})[^>]*>" 随着 ""
    • 替换 "{{{{" 随着 "<"
    • 替换 "}}}}" 随着 ">"

    请注意,上述方法容易出错,在某些时候会失败。把它看作是一个丑陋的黑客,而不是一个真正的解决方案。对于在支持正则表达式的文本编辑器中对某些文本文件进行一次性编辑来说,上述内容是可以的,但对于在应用程序中作为数据处理的一部分进行重复的、真实的使用来说,就没那么多了。

    推荐文章