RegEx只返回'link'标签的'href'属性?

时间:2008-11-06 11:21:23

标签: regex href link-tag

我试图创建一个仅返回<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>

谢谢

5 个答案:

答案 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中。

相关问题