正则表达式<img/>使用src,width,height

时间:2016-05-02 09:16:39

标签: java android html regex

你可能会对这种说法做出反应:H 使用正则表达式进行TML解析是一个非常糟糕的主意,例如this之后,你是对的。

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

我要解析的内容<img src="myurl.jpg" width="12" height="32">

应该解析的内容

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

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

如何合并两者?

期望的输出:

  • img url
  • 宽度值
  • 身高值

3 个答案:

答案 0 :(得分:3)

要将任何<?php //You can save user role in session like: define('ADMIN_ACCESS', 1); define('USER_ADMIN_ACCESS', 2); define('USER_ACCESS', 3); $_SESSION['role'] = ADMIN_ACCESS; // Admin (Any one of three) $_SESSION['role'] = USER_ADMIN_ACCESS; // User Admin (Any one of three) $_SESSION['role'] = USER_ACCESS; // User (Any one of three) //On every page, add a variable which user role can access this page. $requiredRole = ADMIN_ACCESS; //Write a custom function to check user role. function isAuthorized($requiredRole = NULL) { if (session_id() == '') { return FALSE; } if (isset($_SESSION['role'])) { if ($_SESSION['role'] == ADMIN_ACCESS) { return TRUE; // Administrator has access to every page/functionality. } if ($requiredRole < $_SESSION['role']) { return FALSE; } } return FALSE; } //And now, check if user can access the page or not by calling the function. //On every page, add a variable which user role can access this page. $requiredRole = ADMIN_ACCESS; if (! isAuthorized($requiredRole)) { // Redirect user as he is not autorized. } ?> 标记与imgsrcheight属性匹配,这些属性可以按任何顺序排列,实际上是可选的,您可以使用

width

请参阅regex demoIDEONE Java demo

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

正则表达式详情:

  • 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

逻辑:

  • 匹配(?=\\s|/?>)代码
  • 的开头
  • 然后,匹配内部的所有内容,但只捕获我们需要的属性
  • 由于我们将要有多个匹配项,而不是组,我们需要为每个新的img标记找到一个边界。这是通过检查第一组是否为空(img
  • 来完成的
  • 剩下要做的就是添加一个列表以保持匹配。

答案 1 :(得分:0)

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

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

我测试的样本

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

试试这个

答案 2 :(得分:0)

你可能想要这个:

"(?i)(src|width|height)=\"(.*?)\""

<击>

更新:

我误解了你的问题,你需要像:

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

Regex101 Demo

更新2

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

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

Regex101 Demo v2