>我正在尝试为 HTML 制作一个正则表达式,由于某种原因,我想出了一些关于要选择的标题 html 块和标题的小问题,
为了更好地解释它:
<h5>Thing</h5>
都会被选中,但我只想选择<h5>
和</h5>
,这与<title>Test</title>
我只想选择 html 标签,但它选择了整个事情,
这是我到目前为止的正则表达式:
/(</(w+)>)|(<(w+)).+?(?=>)>|(<(w+))>/ig
你的问题在这里:<(w+).+?(?=>)>
这说:
- 打开尖括号
- 使用尽可能多的单词字符(最少 1 个)
- 使用尽可能少的字符(最小 1)
- 确保后面有一个右尖括号
- 使用右尖括号
首先,第 4 步是多余的;你知道接下来会有一个右括号,否则第 5 步将无法匹配。
但更大的问题是第3步。让我们看看<h5>Thing</h5>
会发生什么:
-
<
-
h5
(因为>
不再是一个单词字符) -
>Thing</h5
,因为这是右尖括号之前的最小匹配量(请记住,此处匹配 0 个字符不是一个选项) - 确保接下来是
>
-
>
无论如何,在简单的情况下,您想要的可以通过/</?.+?>/
来完成。如果属性的值包含大于符号:<div title="a>b">
,则会中断。避免这种情况是可能的,但它使正则表达式更加复杂,有点像这样(但我可能忘记了一些东西):
<w+(?:s+w+(?:=(?:"[^"]*"|'[^']*'|[^'"][^s>]*)?)?)*s*>|</w+>