Saltar al contenido

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

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 tagEsto 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\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?";
st = @"http(s)?://([w-]+.)+[w-]+(/[w- ./?%&=]*)?";
st = @"(http|https)://([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?";
st = @"((http|ftp|https)://[w-_]+(.[w-_]+)+([w-.,@?^=%&amp;:/~+#]*[w-@?^=%&amp;/~+#])?)";
st = @"http://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?";
st = @"http(s?)://[0-9a-zA-Z]([-.w]*[0-9a-zA-Z])*(:(0-9)*)*(/?)([a-zA-Z0-9-.?,'/\+&amp;%$#_]*)?$";
st = @"(?<Protocol>w+)://(?<Domain>[w.]+/?)S*";

mi elección es

@"(?<Protocol>w+)://(?<Domain>[w.]+/?)S*"

Segundo uso esto:

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

Problema resuelto. Gracias a todos 🙂

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *