用于从 HTML 标记获取属性的正则表达式

2022-09-03 16:50:45

我正在寻找一个正则表达式,可以从java中的以下HTML片段中获取src(不区分大小写)标签。

<html><img src="kk.gif" alt="text"/></html>
<html><img src='kk.gif' alt="text"/></html>
<html><img src = "kk.gif" alt="text"/></html>

答案 1

一种可能性:

String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";

是一种可能性(如果匹配不区分大小写)。这有点混乱,并且故意忽略了不使用引号的情况。要表示它而不必担心字符串转义::

<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>

这符合:

  • <img
  • 一个或多个不是的字符(即可能的其他属性)>
  • src
  • 可选空格
  • =
  • 可选空格
  • 或 的起始分隔符'"
  • 图像来源(可能不包含单引号或双引号)
  • 结束分隔符
  • 虽然表达式可以止步于此,但我随后添加了:
    • 零个或多个不是的字符(更多可能的属性)>
    • >关闭标签

注意事项:

  • 如果您还想包含,请将左括号进一步向左移动:-)src=
  • 这不关心分隔符平衡或没有分隔符的属性值,并且它还可能阻塞格式不正确的属性(例如包含或的图像源包含或)。>'"
  • 使用这样的正则表达式解析HTML并非易事,充其量只是一个在大多数情况下有效的快速破解。

答案 2

这个问题在这里经常出现。

正则表达式是处理此问题的不良方法。帮自己一个忙,使用某种HTML解析器。

正则表达式对于解析HTML来说是不可靠的。你最终会得到一个复杂的表达式,在某些角落的情况下会出现意外的行为,否则就会发生这种情况。

编辑:如果你的HTML就是这么简单,那么:

Pattern p = Pattern.compile("src\\s*=\\s*([\\"'])?([^ \\"']*)");
Matcher m = p.matcher(str);
if (m.find()) {
  String src = m.group(2);
}

而且有很多Java HTML解析器