题
C#:什么是解析超链接及其描述的好正则表达式?
请考虑不区分大小写、空格以及在 HREF 标记周围使用单引号(而不是双引号)。
另请考虑获取包含其他标签的超链接 <a>
标签如 <b>
和 <i>
.
解决方案
只要没有嵌套标签(并且没有换行符),以下变体就可以很好地工作:
<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
其他提示
请参阅此示例 堆栈溢出:用于解析网页链接的正则表达式?
使用 HTML 敏捷包 您可以解析 html,并使用 HTML 的语义(而不是损坏的正则表达式)提取详细信息。
我 有一个正则表达式 它可以处理大多数情况,但我相信它确实与多行注释中的 HTML 匹配。
它是使用 .NET 语法编写的,但应该很容易翻译。
现在我已经可以工作了,我就把这个片段扔出去......这是之前建议的一个不那么贪婪的版本。如果输入有多个超链接,原始版本将无法工作。下面的代码将允许您循环遍历所有超链接:
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);
}
这是一个将匹配平衡标签的正则表达式。
(?:""'[""'].*?>)(?(?>(?)|(?<-深度>)|.)+)(?(深度)(?!))(?: )
不隶属于 StackOverflow