我试图创建一个仅返回<link>
标签hrefs
为什么这个正则表达式会返回所有href,包括&lt; a hrefs?
(?<=<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>
谢谢
答案 0 :(得分:3)
无论
/(?<=<link\b[^<>]*?)\bhref=\s*=\s*(?:"[^"]*"|'[^']'|\S+)/
或
/<link\b[^<>]*?\b(href=\s*=\s*(?:"[^"]*"|'[^']'|\S+))/
主要区别在于[^<>]*?
而不是.*?
。这是因为您不希望它继续搜索其他标签。
答案 1 :(得分:1)
避免为这种简单的情况做好后卫,只需匹配你需要的东西,然后捕捉你想要的东西。
我使用s和g选项在The Regex Coach中<link\s+[^>]*(href\s*=\s*(['"]).*?\2)
取得了不错的成绩。
答案 2 :(得分:0)
/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/
我自己的背部参考有点不稳定,所以我把它留在了那里。这个正则表达式虽然:
/(<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/
...适用于我的Javascript测试。
答案 3 :(得分:0)
你使用什么正则表达式?例如,Perl不支持可变长度的lookbehind。如果这是一个选项,我会选择(编辑以实现MizardX的非常好的想法):
(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1
作为第一近似值。这样,引号字符('或“)的选择将匹配。 对于不支持(可变长度)lookbehind的语言也是如此:
(?:<link\b[^<>]*?)(href\s*=\s*(['"])(?:(?!\2).)+\2)
\ 1将包含您的匹配。
答案 4 :(得分:0)
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
适用于Expresso(我认为Expresso运行在.NET正则表达式引擎上)。您甚至可以进一步优化这一点以匹配结束'
或
"
:
(?<=<link\s+.*?)href\s*=\s*([\'\"])[^\'\"]+(\1)
也许你的正则表达式引擎不适用于lookbehind断言。解决方法是
(?:<link\s+.*?)(href\s*=\s*([\'\"])[^\'\"]+(\2))
您的匹配将在捕获的组1中。