这是我在 HTML 标签中提取属性的最佳正则表达式:
# 修剪引号内的匹配项(单引号或双引号)
(\S+)\s*=\s*([']|["])\s*([\W\w]*?)\s*\2
# 没有修剪
(\S+)\s*=\s*([']|["])([\W\w]*?)\2
优点:
- 您可以修剪引号内的内容。
- 匹配引号内的所有特殊 ASCII 字符。
- 如果您有 title="You're mine",则 RegEx 不会损坏
缺点:
- 返回3组;首先是属性,然后是引号 ("|'),最后是引号内的属性,即:
<div title="You're"> 结果是第 1 组:标题,第 2 组:",第 3 组:你是。
这是在线 RegEx 示例:
https://regex101.com/r/aVz4uG/13
我通常使用这个 RegEx 来提取 HTML 标签:
如果您不使用 <div、<span 等标签类型,我建议您这样做。
<[^/]+?(?:\".*?\"|'.*?'|.*?)*?>
例如:
<div title="a>b=c<d" data-type='a>b=c<d'>Hello</div>
<span style="color: >=<red">Nothing</span>
# Returns
# <div title="a>b=c<d" data-type='a>b=c<d'>
# <span style="color: >=<red">
这是在线 RegEx 示例:
https://regex101.com/r/aVz4uG/15
这个正则表达式的错误是:
<div[^/]+?(?:\".*?\"|'.*?'|.*?)*?>
在这个标签中:
<article title="a>b=c<d" data-type='a>b=c<div '>Hello</article>
返回<div '>,但不应返回任何匹配项:
Match: <div '>
要“解决”这个问题,请删除 [^/]+? 模式:
<div(?:\".*?\"|'.*?'|.*?)*?>
#317081 的答案很好,但与这些情况不匹配:
<div id="a"> # It returns "a instead of a
<div style=""> # It doesn't match instead of return only an empty property
<div title = "c"> # It not recognize the space between the equal (=)
这是改进:
(\S+)\s*=\s*["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))?[^"']*)["']?
对
(\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?
避免相等信号之间的空格:
(\S+)\s*=\s*((?:...
更改最后一个 + 和 .为了:
|[>"']))?[^"']*)["']?
这是在线 RegEx 示例:
https://regex101.com/r/aVz4uG/8