html - página - Regex para analizar hipervínculos y descripciones
hipervinculos en html ejemplos (6)
Siempre que no haya etiquetas anidadas (y sin saltos de línea), la siguiente variante funciona bien:
<a/s+href=(?:"([^"]+)"|''([^'']+)'').*?>(.*?)</a>
Tan pronto como entran en juego las etiquetas anidadas, las expresiones regulares no son aptas para el análisis. Sin embargo, puede usarlos aplicando funciones más avanzadas de intérpretes modernos (según su máquina de expresiones regulares). Por ejemplo, las expresiones regulares de .NET usan 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
C #: ¿Qué es una buena Regex para analizar hipervínculos y su descripción?
Tenga en cuenta la insensibilidad a las mayúsculas y minúsculas, el espacio en blanco y el uso de comillas simples (en lugar de comillas dobles) alrededor de la etiqueta HREF.
Considere también la posibilidad de obtener hipervínculos que tengan otras etiquetas dentro de las etiquetas <a>
, como <b>
y <i>
.
Tengo una expresión regular que maneja la mayoría de los casos, aunque creo que coincide con HTML en un comentario de varias líneas.
Está escrito usando la sintaxis .NET, pero debe ser fácilmente traducible.
Encontré esto, pero aparentemente estos muchachos tuvieron algunos problemas con eso.
Editar: (¡Funciona!)
Ya hice mi propia prueba 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 de su ejecución en este:
<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" }
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 múltiples hipervínculos. Este código a continuación 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.
(?: "" ''[""'']. *?>) (? (?> (?) | (? <- DEPTH>) |.) +) (? (PROFUNDIDAD) (?!)) (?: )
Vea este ejemplo de : ¿Expresión regular para analizar enlaces desde una página web?
Usando The HTML Agility Pack puedes analizar el html y extraer detalles usando la semántica del HTML, en lugar de una expresión regular descompuesta.