¿Cómo es posible obtener el enlace completo de una cadena como esta?
<a href="https://www.google.com/setprefdomain?prefdom=DE&prev=https://www.google.de/&sig=K_DtcF1dnV7Xn6g9Ir_3SUs6a6TiA%3D">
Quiero aislar la cadena que comienza después de 'href="' y termina en 'A%3D', pero solo si esta cadena contiene el domain
de cadena.
Realmente no sé cómo verificar si la cadena 'dominio' está incluida.
Mi expresión regular hasta ahora es: /(?<=href=")(.*)(?=")/gi
Me encantan las expresiones regulares, pero prefiero no analizar html válido con ellas por cuestiones de estabilidad.
Utilice una técnica de análisis legítima para aislar el atributo href
. Esto asegurará que nunca haga coincidir accidentalmente data-href
o cualquier otro atributo que comparta las letras consecutivas href
. Esto también libera la carga de tener que hacer coincidir la posibilidad de comillas simples o comillas dobles.
Después de aislar el atributo href, use include( includes()
o indexOf()
para verificar si domain
está en alguna parte del valor de la cadena. Si necesita aumentar la precisión del domain
coincidente, ahora puede considerar el uso de expresiones regulares con límites de palabras u otras comprobaciones en las subcadenas circundantes (como comprobar si el domain
aparece antes que el primero ?
).
const str = '<a href="https://www.google.com/setprefdomain?prefdom=DE&prev=https://www.google.de/&sig=K_DtcF1dnV7Xn6g9Ir_3SUs6a6TiA%3D">', url = new DOMParser() .parseFromString(str, 'text/html') .documentElement.querySelector('a') .href; console.log(url.includes('domain') ? url : null);
Para aquellos que piensan que analizar la etiqueta de anclaje válida es demasiado trabajo para una cadena construida de manera confiable, entonces pueden usar regex como atajo (pero probablemente no lo haría en una aplicación profesional).
Use un espacio literal (o límite de palabra - \b
) antes de href
para asegurarse de que está apuntando al atributo correcto y no haciendo una coincidencia parcial en un atributo más grande. Voy a suponer que se garantiza que la cadena de entrada esté entre comillas dobles, así que haga coincidir la cadena entre comillas dobles. Dentro de las comillas dobles, haga coincidir uno o más caracteres que no sean comillas dobles (con avidez), luego la palabra buscada domain
y luego uno o más caracteres que no sean comillas dobles (con avidez). Esto devolverá la URL aislada si califica y eliminará algunos casos marginales que podrían dañar el resultado.
let str = `<a class="domain" data-dummy-href="example.com" href="https://www.google.com/setprefdomain?prefdom=DE&prev=https://www.google.de/&sig=K_DtcF1dnV7Xn6g9Ir_3SUs6a6TiA%3D" style="background-image: url('http://www.example.com/domain/123.png')">`; console.log(str.match(/ href="([^"]+domain[^"]+)"/i)[1] || 'Not valid');
Si domain
puede aparecer al principio o al final del valor href, cambie respectivamente +
a *
para cambiar el calificador de "uno o más" a "cero o más".
Creo que la respuesta de @ jscrip puede ser la forma más directa. Alternativamente, puede verificar si la cadena incluye la cadena 'dominio' antes de hacer coincidir la expresión regular. Por ejemplo:
let str = '<a href="https://www.google.com/setprefdomain?prefdom=DE&prev=https://www.google.de/&sig=K_DtcF1dnV7Xn6g9Ir_3SUs6a6TiA%3D">' let href = str.includes('domain') ? str.match(/(?<=href=").*(?=")/)[0] : 'Not valid' console.log(href)