C#:什么是解析超链接及其描述的优秀正则表达式?
请考虑不区分大小写,空白区域以及在HREF标记周围使用单引号(而不是双引号)。
另请考虑获取<a>
标记中包含其他标记的超链接,例如<b>
和<i>
。
答案 0 :(得分: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 :(得分:3)
请参阅StackOverflow: Regular expression for parsing links from a webpage?
中的此示例使用The HTML Agility Pack,你可以解析html,并使用HTML的语义提取细节,而不是破坏的正则表达式。
答案 2 :(得分: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" }
答案 3 :(得分:1)
I have a regex处理大多数情况,但我相信它在多行评论中与HTML匹配。
它是使用.NET语法编写的,但应该很容易翻译。
答案 4 :(得分: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);
}
答案 5 :(得分:0)
这是一个与平衡标签匹配的正则表达式。
(??: “” '[ “”'] * GT)(?(大于()|(小于?-depth&GT;)|)+。)((深度)(? !))(?:)