expresión regular para encontrar el valor ‘href’ de un enlace

Necesito un patrón de expresiones regulares para encontrar enlaces a páginas web en HTML.

Primero uso @"(.*?)" para extraer enlaces ( ), pero no puedo obtener href de eso.

Mis hilos son:

1, 2 y 3 son válidos y los necesito, pero el número 4 no es válido para mí ( ? Y = es esencial)


Gracias a todos, pero no necesito analizar . Tengo una lista de enlaces en formato href="abcdef" .

Necesito buscar href de los enlaces y filtrarlo, mis URLs favoritas deben contenerse ? y = como page.php?id=5

¡Gracias!

Recomiendo usar un analizador HTML sobre una expresión regular, pero aún así hay una expresión regular que creará un grupo de captura sobre el valor del atributo href de cada enlace. Coincidirá si se utilizan comillas dobles o simples.

 ]*?\s+)?href=(["'])(.*?)\1 

Puede ver una explicación completa de esta expresión regular aquí .

Patio de Snippet:

 let rx = /]*?\s+)?href=(["'])(.*?)\1/, textToMatchInput = document.querySelector('[name=textToMatch]'); document.querySelector('button').addEventListener('click', function () { console.log(textToMatchInput.value.match(rx)); }); 
  

No se recomienda usar regex para analizar html

regex se usa para patrones que ocurren regularmente. html no es regular con su formato (excepto xhtml ) .Por ejemplo, los archivos html son válidos incluso si no tiene una closing tag . Esto podría romper su código.

Usa un analizador html como htmlagilitypack

Puede usar este código para recuperar todos los href's en la etiqueta de anclaje usando HtmlAgilityPack

 HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var hrefList = doc.DocumentNode.SelectNodes("//a") .Select(p => p.GetAttributeValue("href", "not found")) .ToList(); 

hrefList contiene todos los href`s

Prueba esto :

  public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var res = Find(html); } public static List Find(string file) { List list = new List(); // 1. // Find all matches in file. MatchCollection m1 = Regex.Matches(file, @"(.*?)", 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; } } } 

Entrada:

  string html = " 2. "; 

Resultado:

 [0] = {www.aaa.xx/xx.zz?id=xxxx&name=xxxx} [1] = {http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx} 

C # Scraping Enlaces HTML

El raspado de HTML extrae elementos importantes de la página. Tiene muchos usos legales para webmasters y desarrolladores de ASP.NET. Con el tipo Regex y WebClient, implementamos el raspado de la pantalla para HTML.

Editado

Otra manera fácil: puede usar un control de web browser para obtener href de la etiqueta a , como esta: (ver mi ejemplo)

  public Form1() { InitializeComponent(); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); } private void Form1_Load(object sender, EventArgs e) { webBrowser1.DocumentText = ""; } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { List href = new List(); foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("a")) { href.Add(el.GetAttribute("href")); } } 

Prueba esta expresión regular:

 "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))" 

Obtendrá más ayuda de las discusiones sobre:

Expresión regular para extraer URL de un enlace HTML

y

Regex para obtener el enlace en href. [asp.net]

Espero que sea útil.

  HTMLDocument DOC = this.MySuperBrowser.Document as HTMLDocument; public IHTMLAnchorElement imageElementHref; imageElementHref = DOC.getElementById("idfirsticonhref") as IHTMLAnchorElement; 

Simplemente prueba este código

Gracias a todos (especialmente @plalx)

Me resulta bastante exagerado aplicar la validez del atributo href con un patrón tan complejo y críptico, mientras que una expresión simple como
]*?\s+)?href="([^"]*)"
sería suficiente para capturar todas las URL. Si quiere asegurarse de que contienen al menos una cadena de consulta, puede usar
]*?\s+)?href="([^"]+\?[^"]+)"


Mi última cadena de expresiones regulares:

Primero usa uno de esto:

 st =@"((www\.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+ \w\d:#@%/;$()~_?\+-=\\\.&]*)"; st = "@]*>(.*?)"; 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=[""'](?(http|https)://[^/]*?\.(com|org|net|gov))(/.*)?[""']"; st = @"(.*?)"; 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 = @"(?\w+):\/\/(?[\w.]+\/?)\S*"; 

mi elección es

 @"(?\w+):\/\/(?[\w.]+\/?)\S*" 

Segundo Use esto:

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

Problema resuelto. Gracias a todos 🙂

Se me ocurrió esta, que admite tags de anclaje e imagen, y admite comillas simples y dobles.

 <[a|img]+\\s+(?:[^>]*?\\s+)?[src|href]+=[\"']([^\"']*)['\"] 

Asi que

 click here 

Coincidirá:

  Match 1: https://stackoverflow.com/something.ext 

Y

 click here 

Coincidirá:

  Match 1: https://stackoverflow.com/something.ext 

Lo mismo ocurre con los atributos img src