RegEx para devolver el atributo ''href'' de las etiquetas ''link'' solamente?
link-tag (5)
Estoy tratando de crear una expresión regular que solo devuelve hrefs de la etiqueta <link>
¿Por qué esta expresión regular devuelve todos los hrefs incluyendo <a hrefs?
(?<=<link/s+.*?)href/s*=/s*[/'/"][^/'/"]+
<link rel="stylesheet" rev="stylesheet" href="idlecore-tidied.css?T_2_5_0_228" media="screen"> <a href="anotherurl">Slash Boxes</a>
gracias
Ya sea
/(?<=<link/b[^<>]*?)/bhref=/s*=/s*(?:"[^"]*"|''[^'']''|/S+)/
o
/<link/b[^<>]*?/b(href=/s*=/s*(?:"[^"]*"|''[^'']''|/S+))/
La principal diferencia es [^<>]*?
en lugar de .*?
. Esto se debe a que no desea que continúe la búsqueda en otras etiquetas.
(?<=<link/s+.*?)href/s*=/s*[/'/"][^/'/"]+
funciona con Expresso (creo que Expresso se ejecuta en .NET Regex-Engine). Incluso podría refinar esto un poco más para que coincida con el cierre ''
o "
:
(?<=<link/s+.*?)href/s*=/s*([/'/"])[^/'/"]+(/1)
Tal vez su motor de expresiones regulares no funciona con aserciones de búsqueda hacia atrás. Una solución alternativa sería
(?:<link/s+.*?)(href/s*=/s*([/'/"])[^/'/"]+(/2))
Tu partida estará entonces en el grupo capturado 1.
/(?<=<link/s+.*?)href/s*=/s*[/'/"][^/'/"]+[^>]*>/
estoy un poco tembloroso en la parte posterior, me refiero a mí mismo, así que lo dejé allí. Sin embargo, esta expresión regular:
/(<link/s+.*?)href/s*=/s*[/'/"][^/'/"]+[^>]*>/
... funciona en mi prueba de Javascript.
¿Qué sabor regex estás usando? Perl, por ejemplo, no admite look-behind de longitud variable. Donde sea una opción, elegiría (editado para implementar la muy buena idea de MizardX):
(?<=<link/b[^<>]*?)href/s*=/s*([''"])(?:(?!/1).)+/1
como primera aproximación. De esta forma, la elección del carácter de comillas (''o'') se igualará. Lo mismo para un idioma sin soporte para el aspecto (de longitud variable) detrás:
(?:<link/b[^<>]*?)(href/s*=/s*([''"])(?:(?!/2).)+/2)
/ 1 contendrá su coincidencia.
Evita mirar hacia atrás para un caso tan simple, solo combina lo que necesitas y captura lo que deseas obtener.
Obtuve buenos resultados con <link/s+[^>]*(href/s*=/s*([''"]).*?/2)
en The Regex Coach con las opciones s y g.