你可能会对这种说法做出反应:H 使用正则表达式进行TML解析是一个非常糟糕的主意,例如this之后,你是对的。
但在我的情况下,下面的html节点是由我们自己的服务器创建的,所以我们知道它总是这样,并且因为正则表达式将在移动安卓库中,所以我不知道我不想使用像Jsoup这样的库。
我要解析的内容:<img src="myurl.jpg" width="12" height="32">
应该解析的内容:
<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>
(width|height)\s*=\s*['"]([^'"]*)['"]*
因此,第一个正则表达式将具有带有img url的#1组,而第二个正则表达式将具有两个与其值的子组匹配的匹配。
如何合并两者?
期望的输出:
答案 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.
}
?>
标记与img
,src
和height
属性匹配,这些属性可以按任何顺序排列,实际上是可选的,您可以使用
width
请参阅regex demo和IDEONE 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=\"(.*?)\">"
更新2
下面的正则表达式将按任意顺序捕获img
标记属性:
"(?i)(?><img\\s+)src=\"(.*?)\"|width=\"(.*?)\"|height=\"(.*?)\">"