Solución:
Recomendaría usar un analizador HTML sobre una expresión regular, pero aún así, aquí hay una expresión regular que creará un grupo de captura sobre el valor de la href
atributo de cada enlace. Coincidirá si se utilizan comillas simples o dobles.
<as+(?:[^>]*?s+)?href=(["'])(.*?)1
Puede ver una explicación completa de esta expresión regular aquí.
Zona de juegos de fragmentos:
const linkRx = /<as+(?:[^>]*?s+)?href=(["'])(.*?)1/;
const textToMatchInput = document.querySelector('[name=textToMatch]');
document.querySelector('button').addEventListener('click', () => {
console.log(textToMatchInput.value.match(linkRx));
});
<label>
Text to match:
<input type="text" name="textToMatch" value="<a href="https://foroayuda.es/google.com"">
<button>Match</button>
</label>
Utilizando regex
no se recomienda analizar html
regex
se utiliza para patrones que ocurren regularmente.html
no es regular con su formato (excepto xhtml
).Por ejemplo html
los archivos son válidos incluso si no tener un closing tag
Esto podría romper su código.
Utilice un analizador html como htmlagilitypack
Puede utilizar este código para recuperar todos href's
en 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
Gracias a todos (especialmente @plalx)
Me parece bastante exagerado hacer cumplir la validez del atributo href con un patrón tan complejo y críptico, mientras que una expresión simple como
<as+(?:[^>]*?s+)?href="https://foroayuda.es/([^"]*)"
sería suficiente para capturar todas las URL. Si desea asegurarse de que contengan al menos una cadena de consulta, puede usar
<as+(?:[^>]*?s+)?href="https://foroayuda.es/([^"]+?[^"]+)"
Mi cadena de expresiones regulares final:
Primero use uno de esto:
st = @"((www.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\))+ wd:#@%/;$()~_?+-=\.&]*)";
st = @"<a href[^>]*>(.*?)</a>";
st = @"((([A-Za-z]{3,9}:(?://)?)(?:[-;:&=+$,w][email protected])?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,w][email protected])[A-Za-z0-9.-]+)((?:/[+~%/.w-_]*)???(?:[-+=&;%@.w_]*)#?(?:[w]*))?)";
st = @"((?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\)(?:www.)?|www.)[wd:#@%/;$()~_?+,-=\.&]+)";
st = @"(?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\)(?:www.)?|www.)";
st = @"(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\))+)|(www.)[wd:#@%/;$()~_?+-=\.&]*)";
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\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?";
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 = @"(?<Protocol>w+)://(?<Domain>[w.]+/?)S*";
mi elección es
@"(?<Protocol>w+)://(?<Domain>[w.]+/?)S*"
Segundo uso esto:
st = "(.*)?(.*)=(.*)";