4

C#:解析超链接及其描述的好正则表达式是什么?

请考虑不区分大小写、空格和在 HREF 标记周围使用单引号(而不是双引号)。

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

4

6 回答 6

5

只要没有嵌套标签(并且没有换行符),以下变体就可以很好地工作:

<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

于 2008-08-25T16:21:47.833 回答
3

请参阅 StackOverflow 中的此示例:用于解析网页链接的正则表达式?

使用HTML 敏捷包,您可以解析 html,并使用 HTML 的语义提取详细信息,而不是使用损坏的正则表达式。

于 2008-09-19T09:11:17.347 回答
1

我发现了这个,但显然这些人对此有一些问题。

编辑:(它有效!)
我现在已经完成了自己的测试,发现它有效,我不知道 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" } 
于 2008-08-25T16:09:11.780 回答
1

有一个处理大多数情况的正则表达式,尽管我相信它确实匹配多行注释中的 HTML。

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

于 2008-08-25T16:26:44.343 回答
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);
}
于 2009-11-12T06:08:13.537 回答
0

这是一个匹配平衡标签的正则表达式。

(?:""'[""'].*?>)(?(?>(?)|(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?: )

于 2009-11-29T15:37:25.500 回答