2011-04-01 67 views
0

我试图构建正则表达式来从文本中提取链接没有rel =“nofollow”正则表达式提取具有指定属性的链接

例子:

aiusdiua asudauih <a rel="nofollow" hre="http://uashiuadha.asudh/adas>adsaag</a> uhwaida <br> asdgydug <a href="http://asdha.sda/uduih/dufhuis>aguuia</a>

谢谢!

+0

...有没有可能使用解析器而不是正则表达式? – jensgram 2011-04-01 08:15:57

+0

不,我想使它与正则表达式 – 2011-04-01 08:18:50

回答

2

下面的正则表达式将做的工作:

<a (?![^>]*?rel="nofollow")[^>]*?href="(.*?)" 

想要的网址将位于捕获组#1中。例如。在Ruby中这将是:

if input =~ /<a (?![^>]*?rel="nofollow")[^>]*?href="(.*?)"/ 
    match = $~[1] 
end 

由于在负先行href或其他任何东西可以rel来之前rel之前接受[^>]*?。如果hrefrel之后,它当然也可以。

+0

我使用正则表达式的经验在使用时请务必小心。*? – CodeWrite 2011-04-01 08:35:48

+0

@regexhacks:为什么要小心使用'。*?' – 2011-04-01 08:58:43

+0

@regexhacks我同意。一个人必须小心,不接受任何或无限的所有量词。 – 2011-04-01 09:07:13

0

试试这个 <(?:A|AREA)\b[^<>]*?(?!rel="nofollow")[^<>]*?href=['"]([^>"]*)[^>]*?>

,如果你使用的是.NET的正则表达式,然后

<(?:A|AREA)\b[^<>]*?(?!rel="nofollow")[^<>]*?href=['"](?<URL>[^>"]*)[^>]*?> 

数据位于名为URL组或组1

+0

我认为你将不得不修复关于这个答案的两个问题: 1)现在它会发现实际上有'rel =“nofollow”'的字符串,但问题是相反的问题。 2)如果'href'在'a'标签的'rel'之前出现,则不匹配。 – 2011-04-01 08:39:15