Creé una función que debería verificar si una cadena corresponde a un formato de URL:
const test = (str) => { const t = new RegExp( '^(https?:\\/\\/)?' + '(www\\.)' + '((([az\\d]([az\\d-]*[az\\d])*)\\.)+[az]{2,}|)' + '(\\#[-az\\d_]*)?$', 'i', ); return t.test(str); }; console.log(test('http://demo.com')); //expect true console.log(test('http://ww.demo.com')); //expect false Para cada console.log() escribí el valor esperado, en ambos casos obtuve falso. En el último caso false está bien, pero en el primero debería ser true . ¿Cómo arreglar la expresión regular?
Incluso si esta respuesta es demasiado para este problema, ilustra el problema: incluso si fuera posible crear una expresión regular para verificar la URL, es mucho más simple y más sólido analizar la URL y "crear un objeto real". ", en / con el cual la prueba general se puede descomponer en una serie de pruebas más pequeñas.
Entonces, probablemente el constructor de URL incorporado de los navegadores modernos pueda ayudarlo aquí ( enlace 1 , enlace 2 ).
Un enfoque para probar su URL podría verse así:
function testURL (urlstring) { var errors = []; try { var url = new URL(urlstring); if (!/https/.test(url.protocol)) { errors.push('wrong protocol'); } //more tests here } catch(err) { //something went really wrong //log the error here } finally { return errors; } }if (testURL('mr.bean').length == 0) { runSomething(); }