Pregunta

C#:¿Cuál es una buena expresión regular para analizar hipervínculos y su descripción?

Tenga en cuenta la distinción entre mayúsculas y minúsculas, los espacios en blanco y el uso de comillas simples (en lugar de comillas dobles) alrededor de la etiqueta HREF.

Considere también obtener hipervínculos que tengan otras etiquetas dentro del <a> etiquetas como <b> y <i>. ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

¿Fue útil?

Solución

Siempre que no haya etiquetas anidadas (ni saltos de línea), la siguiente variante funciona bien:

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

Tan pronto como las etiquetas anidadas entran en juego, las expresiones regulares no son aptas para el análisis.Sin embargo, aún puede usarlos aplicando funciones más avanzadas de los intérpretes modernos (dependiendo de su máquina de expresiones regulares).P.ej.Las expresiones regulares .NET utilizan una pila;Encontré esto:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

Fuente: http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

Otros consejos

Vea este ejemplo de Desbordamiento de pila:¿Expresión regular para analizar enlaces desde una página web?

Usando El paquete de agilidad HTML puede analizar el HTML y extraer detalles utilizando la semántica del HTML, en lugar de una expresión regular rota.

encontré esto pero aparentemente estos chicos Tuve algunos problemas con eso.

Editar: (¡Funciona!)
Ahora hice mis propias pruebas y descubrí que funciona, no sé C#, así que no puedo darte una respuesta de C#, pero sí conozco PHP y aquí está la matriz de coincidencias que obtuve al ejecutarlo en esto:

<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" } 

I tener una expresión regular eso maneja la mayoría de los casos, aunque creo que coincide con HTML dentro de un comentario de varias líneas.

Está escrito utilizando la sintaxis .NET, pero debería ser fácilmente traducible.

Voy a publicar este fragmento ahora que lo tengo funcionando... esta es una versión menos codiciosa de una sugerida anteriormente.El original no funcionaría si la entrada tuviera varios hipervínculos.El siguiente código le permitirá recorrer todos los hipervínculos:

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);
}

Aquí hay una expresión regular que coincidirá con las etiquetas equilibradas.

(?:""'[""'].*?>)(?(?>(?)|(?<-PROFUNDIDAD>)|.)+)(?(PROFUNDIDAD)(?!))(?: )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top