用于查找<a>链接的“href”值的正则expression式

我需要一个正则expression式模式来查找HTML中的网页链接。

我首先使用@"(<a.*?>.*?</a>)"来提取链接( <a> ),但我无法从中获取href

我的string是:

  1. <a href="www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
  2. <a href="http://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
  3. <a href="https://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
  4. <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\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"; st = @"(http|https)://([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"((http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)"; st = @"http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$"; st = @"(?<Protocol>\w+):\/\/(?<Domain>[\w.]+\/?)\S*"; 

我的select是

 @"(?<Protocol>\w+):\/\/(?<Domain>[\w.]+\/?)\S*" 

第二使用这个:

 st = "(.*)?(.*)=(.*)"; 

问题解决了。 感谢大家 :)