我正在尝试编写一个只返回<link>
标签href的正则表达式。
为什么这个正则表达式返回所有包括的href?
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
<link rel="stylesheet" rev="stylesheet" href="idlecore-tidied.css?T_2_5_0_228" media="screen">
<a href="anotherurl">Slash Boxes</a>
我正在尝试编写一个只返回<link>
标签href的正则表达式。
为什么这个正则表达式返回所有包括的href?
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
<link rel="stylesheet" rev="stylesheet" href="idlecore-tidied.css?T_2_5_0_228" media="screen">
<a href="anotherurl">Slash Boxes</a>
无论哪种方式
/(?<=<link\b[^<>]*?)\bhref=\s*=\s*(?:"[^"]*"|'[^']'|\S+)/
或者
/<link\b[^<>]*?\b(href=\s*=\s*(?:"[^"]*"|'[^']'|\S+))/
[^<>]*?
而不是.*?
。这是因为您不希望它继续搜索其他标签。<link\s+[^>]*(href\s*=\s*(['"]).*?\2)
获得了良好的结果。/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/
我自己对反向引用还有点摸不着头脑,所以我把它留在那里了。但是这个正则表达式:
/(<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/
...在我的Javascript测试中运行。
(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1
作为第一次近似。这样引号字符的选择('或")将被匹配。 对于不支持(可变长度)回顾的语言也是如此:
(?:<link\b[^<>]*?)(href\s*=\s*(['"])(?:(?!\2).)+\2)
\1 将包含您的匹配。
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
适用于Expresso(我认为Expresso在.NET正则表达式引擎上运行)。您甚至可以进一步细化以匹配闭合的'
或"
:
(?<=<link\s+.*?)href\s*=\s*([\'\"])[^\'\"]+(\1)
可能你的正则表达式引擎不支持向后断言。一个解决方法是
(?:<link\s+.*?)(href\s*=\s*([\'\"])[^\'\"]+(\2))
你的匹配结果将在第一个捕获组中。