首页 文章

正则表达式<img>使用src,width,height进行标记解析

提问于
浏览
7

你可能会回应这个说H TML Parsing using regex is a totally bad idea ,例如this,你是对的 .

但在我的情况下,下面的html节点是由我们自己的服务器创建的,所以我们知道它总是这样,并且由于正则表达式将在_2789411中,我不想使用像Jsoup这样的库 .

What I want to parse<img src="myurl.jpg" width="12" height="32">

What should be parsed

  • 匹配常规img标记,并将src属性值分组: <img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>

  • width和height属性值: (width|height)\s*=\s*['"]([^'"]*)['"]*

因此,第一个正则表达式将具有带有img url的#1组,而第二个正则表达式将具有与其值的子组的两个匹配 .

How can I merge both?

期望的输出:

  • img url

  • 宽度值

  • 身高值

3 回答

  • 3

    如果你想把这两者结合起来就是答案 .

    <img\s+src="([^"]+)"\s+width="([^"]+)"\s+height="([^"]+)"
    

    我测试的样品

    <img src="rakesh.jpg" width="25" height="45">
    

    试试这个

  • 0

    要将 img 标记与 srcheightwidth 属性匹配,这些属性可以按任何顺序排列,并且实际上是可选的,您可以使用

    "(<img\\b|(?!^)\\G)[^>]*?\\b(src|width|height)=([\"']?)([^>]*?)\\3"
    

    请参阅regex demoIDEONE Java demo

    String s = "<img height=\"132\" src=\"NEW_myurl.jpg\" width=\"112\"><link src=\"/test/test.css\"/><img src=\"myurl.jpg\" width=\"12\" height=\"32\">";
    Pattern pattern = Pattern.compile("(<img\\b|(?!^)\\G)[^>]*?\\b(src|width|height)=([\"']?)([^\"]*)\\3");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()){
        if (!matcher.group(1).isEmpty()) { // We have a new IMG tag
            System.out.println("\n--- NEW MATCH ---");  
        }
        System.out.println(matcher.group(2) + ": " + matcher.group(4));
    }
    

    正则表达式详细信息:

    • (<img\\b|(?!^)\\G) - 与 <img> 标记开始匹配的初始边界或上一次成功匹配的结束

    • [^>]*? - 匹配我们不感兴趣的任何可选属性(除了 > 之外的0个字符以便留在标签内) - \\b(src|width|height)= - 整个单词 src=width=height=

    • ([\"']?) - 检查属性值分隔符的技术第3组

    • ([^>]*?) - 包含属性值的第4组(除了 > 之外的0个字符,尽可能少于第一个

    • \\3 - 属性值分隔符与组3匹配(如果分隔符可能为空,则为 NOTE ,在模式末尾添加 (?=\\s|/?>)

    逻辑:

    • 匹配 img 标记的开头

    • 然后,匹配内部的所有内容,但只捕获我们需要的属性

    • 由于我们将要有多个匹配,而不是组,我们需要为每个新的 img 标记找到边界 . 这是通过检查第一组是否为空来完成的( if (!matcher.group(1).isEmpty())

    • 剩下要做的就是添加一个列表以保持匹配 .

  • 0

    你可能想要这个:
    “(Ⅰ')(SRC |宽度|高度)= \” \ “”(*?)


    Update:

    我误解了你的问题,你需要这样的东西:

    "(?i)<img\\s+src=\"(.*?)\"\\s+width=\"(.*?)\"\\s+height=\"(.*?)\">"
    

    Regex101 Demo


    Update 2

    下面的正则表达式将以任何顺序捕获 img 标记属性:

    "(?i)(?><img\\s+)src=\"(.*?)\"|width=\"(.*?)\"|height=\"(.*?)\">"
    

    Regex101 Demo v2

相关问题