用于查找<a>链接的“href”值的正则expression式
我需要一个正则expression式模式来查找HTML中的网页链接。
我首先使用@"(<a.*?>.*?</a>)"来提取链接( <a> ),但我无法从中获取href 。 
我的string是:
-  <a href="www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
-  <a href="http://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
-  <a href="https://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
-  <a href="www.example.com/page.php/404" ....></a>
  1,2和3是有效的,我需要它们,但是4号对我来说是无效的( ?和=是必需的) 
 谢谢大家,但我不需要parsing<a> 。 我有一个href="abcdef"格式的链接列表。 
 我需要获取链接的href并过滤它,我最喜欢的url必须包含? 和=像page.php?id=5 
谢谢!
 我build议使用一个正则expression式的HTMLparsing器,但这里仍然是一个正则expression式,它将在每个链接的href属性的值上创build一个捕获组。 它将匹配是否使用双引号或单引号。 
 <a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1 
你可以在这里查看这个正则expression式的完整解释。
片段游乐场:
 let rx = /<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1/, textToMatchInput = document.querySelector('[name=textToMatch]'); document.querySelector('button').addEventListener('click', function () { console.log(textToMatchInput.value.match(rx)); }); 
 <label> Text to match: <input type="text" name="textToMatch" value='<a href="google.com"'> <button>Match</button> </label> 
 不推荐使用regex来parsinghtml 
  regex用于定期发生的模式。  html不是正规的格式( xhtml除外)。例如,即使你没有 closing tag html文件也是有效的!这可能会破坏你的代码。 
使用像htmlagilitypack这样的htmlparsing器
 您可以使用此代码使用HtmlAgilityPack检索锚标记中的所有href's 
 HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var hrefList = doc.DocumentNode.SelectNodes("//a") .Select(p => p.GetAttributeValue("href", "not found")) .ToList(); 
  hrefList包含所有的href 
尝试这个 :
  public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var res = Find(html); } public static List<LinkItem> Find(string file) { List<LinkItem> list = new List<LinkItem>(); // 1. // Find all matches in file. MatchCollection m1 = Regex.Matches(file, @"(<a.*?>.*?</a>)", RegexOptions.Singleline); // 2. // Loop over each match. foreach (Match m in m1) { string value = m.Groups[1].Value; LinkItem i = new LinkItem(); // 3. // Get href attribute. Match m2 = Regex.Match(value, @"href=\""(.*?)\""", RegexOptions.Singleline); if (m2.Success) { i.Href = m2.Groups[1].Value; } // 4. // Remove inner tags from text. string t = Regex.Replace(value, @"\s*<.*?>\s*", "", RegexOptions.Singleline); i.Text = t; list.Add(i); } return list; } public struct LinkItem { public string Href; public string Text; public override string ToString() { return Href + "\n\t" + Text; } } } 
input:
  string html = "<a href=\"www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a> 2.<a href=\"http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a> "; 
结果:
 [0] = {www.aaa.xx/xx.zz?id=xxxx&name=xxxx} [1] = {http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx} 
C#刮取HTML链接
刮HTML提取重要的页面元素。 它有许多网站pipe理员和ASP.NET开发人员的合法用途。 使用Regextypes和WebClient,我们实现HTML的屏幕抓取。
编辑
 另一个简单的方法是:你可以使用web browser控件从标签a获取href ,如下所示:(参见我的示例) 
  public Form1() { InitializeComponent(); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); } private void Form1_Load(object sender, EventArgs e) { webBrowser1.DocumentText = "<a href=\"www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a><a href=\"http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a><a href=\"https://www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a><a href=\"www.aaa.xx/xx.zz/xxx\" ....></a>"; } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { List<string> href = new List<string>(); foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("a")) { href.Add(el.GetAttribute("href")); } } 
试试这个正则expression式:
 "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))" 
您将从以下讨论中获得更多帮助:
正则expression式从HTML链接提取URL
和
正则expression式在href中获取链接。 [asp.net]
希望它的帮助。
  HTMLDocument DOC = this.MySuperBrowser.Document as HTMLDocument; public IHTMLAnchorElement imageElementHref; imageElementHref = DOC.getElementById("idfirsticonhref") as IHTMLAnchorElement; 
只需尝试此代码
我想出了这个,支持锚点和图像标签,并支持单引号和双引号。
 <[a|img]+\\s+(?:[^>]*?\\s+)?[src|href]+=[\"']([^\"']*)['\"] 
所以
 <a href="/something.ext">click here</a> 
匹配:
  Match 1: /something.ext 
和
 <a href='/something.ext'>click here</a> 
匹配:
  Match 1: /something.ext 
img src属性也一样
谢谢大家(特别是@plalx)
我觉得这是相当矫枉过正的强化href属性的有效性这样一个复杂和神秘的模式,而一个简单的expression式,如
<a\s+(?:[^>]*?\s+)?href="([^"]*)"
足以捕获所有的URL。 如果你想确保它们至less包含一个查询string,你可以使用
<a\s+(?:[^>]*?\s+)?href="([^"]+\?[^"]+)"
我最后的正则expression式string:
首先使用下面的一个:
 st =@"((www\.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+ \w\d:#@%/;$()~_?\+-=\\\.&]*)"; st = "@<a href[^>]*>(.*?)</a>"; st = @"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)"; st = @"((?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\\\)(?:www\.)?|www\.)[\w\d:#@%/;$()~_?\+,\-=\\.&]+)"; st = @"(?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\\\)(?:www\.)?|www\.)"; st = @"(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)|(www\.)[\w\d:#@%/;$()~_?\+-=\\\.&]*)"; st = @"href=[""'](?<url>(http|https)://[^/]*?\.(com|org|net|gov))(/.*)?[""']"; st = @"(<a.*?>.*?</a>)"; st = @"(?:hrefs*=)(?:[s""']*)(?!#|mailto|location.|javascript|.*css|.*this.)(?.*?)(?:[s>""'])"; st = @"http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"; st = @"(http|https)://([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"((http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)"; st = @"http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$"; st = @"(?<Protocol>\w+):\/\/(?<Domain>[\w.]+\/?)\S*"; 
我的select是
 @"(?<Protocol>\w+):\/\/(?<Domain>[\w.]+\/?)\S*" 
第二使用这个:
 st = "(.*)?(.*)=(.*)";