2008-11-06 35 views
3

我试着去制作一个正则表达式,只有返回<link>标签的HREFRegEx仅返回'link'标签的'href'属性?

为什么这个表达式返回所有的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> 

谢谢

+0

请重新说明问题。我认为任何人都不会理解你的问题。 – Rexxars 2008-11-06 11:24:22

回答

3

要么

/(?<=<link\b[^<>]*?)\bhref=\s*=\s*(?:"[^"]*"|'[^']'|\S+)/ 

/<link\b[^<>]*?\b(href=\s*=\s*(?:"[^"]*"|'[^']'|\S+))/ 

的主要区别是[^<>]*?代替.*? 。这是因为你不希望它继续搜索到其他标签。

+0

优秀!我绝不会选那个! – 2008-11-06 12:32:18

0
/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/ 

我在后面引用自己有点不稳,所以我离开了那里。这个正则表达式:

/(<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/ 

...在我的Javascript测试中工作。

+1

这似乎不起作用 – 2008-11-06 11:31:57

0

你使用的是什么正则表达式?举例来说,Perl不支持可变长度后视。当这是一个选择,我会选择(编辑,以实现从MizardX很好的想法):

(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1 

作为第一近似。这样引号字符的选择(”或“)将匹配 同为不为(可变长度)支持的语言回顾后:

(?:<link\b[^<>]*?)(href\s*=\s*(['"])(?:(?!\2).)+\2) 

\ 1将包含比赛

0
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+ 
。 。

作品与Expresso(我认为快报的.NET正则表达式引擎运行),你甚至可以细化这一点,以匹配收盘'"

(?<=<link\s+.*?)href\s*=\s*([\'\"])[^\'\"]+(\1) 

也许你的正则表达式引擎不适用于lookbehind断言。一种解决方法是

(?:<link\s+.*?)(href\s*=\s*([\'\"])[^\'\"]+(\2)) 

然后你的匹配将是所捕获的组中的1

1

避免这种简单情况下的逆序,只需匹配你所需要的,并捕获你想得到的东西。

我收到了很好的结果<link\s+[^>]*(href\s*=\s*(['"]).*?\2)在正则表达式教练与s和g选项。

相关问题