2008-08-25 55 views
3

C#:解析超链接和它们的描述的正则表达式是什么?解析超链接和描述的正则表达式

请考虑HREF标签周围的大小写不敏感,空格和使用单引号(而不是双引号)。

也请考虑获取在<a>标记中包含其他标记的超链接,例如<b><i>

回答

6

只要没有嵌套标记(没有换行符),下面的变形效果很好:

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

一旦随着嵌套标签的进入玩,正则表达式不适合解析。不过,您仍然可以通过应用现代解释器的更高级功能(取决于您的正则表达式机器)来使用它们。例如。 .NET正则表达式使用堆栈;我发现这一点:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

来源:http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

1

I found this但显然these guys有一些问题。

编辑:(它的工作原理!)
我现在已经做了我自己的测试,发现它的作品,我不知道C#,所以我不能给你一个C#的答案,但我知道PHP和这里的比赛阵列我从运行这样的事回来:

<a href="pages/index.php" title="the title">Text</a> 

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 
1

have a regex,处理大多数情况下,但我相信它确实多行注释中匹配的HTML。

它使用.NET语法编写,但应易于翻译。

0

只是要把这个片段扔出去,现在我有它的工作..这是一个不太贪婪的版本之前建议的一个。如果输入有多个超链接,原始工作将不起作用。下面的代码将允许您遍历所有超链接:

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
public void ParseHyperlinks(string html) 
{ 
    MatchCollection mcHref = rHref.Matches(html); 

    foreach (Match m in mcHref) 
     AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value); 
} 
0

这里是一个正则表达式,它将匹配平衡标签。 (?(?)(?)|(?< -DEPTH>)。。)+)(?(DEPTH)(?!))????????????????????? )(?:)