Je souhaite tester la validité de mes URL , qui doivent commencer par http:// ou https:// ,

J'ai utilisé cette RegExp :

private testIfValidURL(str) {
    const pattern = new RegExp('^(https?:\\/\\/)?' + // protocol
      '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
      '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
      '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
      '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
      '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator
    return !!pattern.test(str);
  }

Cela fonctionnerait, sauf dans un cas :

Pour le considérer comme valide, mes URL doivent toujours commencer par http:// ou https:// , mais avec ma fonction , les URL comme www.abcd.com seraient traitées comme des URL valides, ce qui ne me suffit pas.

Suggestions ?

1
firasKoubaa 14 mars 2019 à 15:40

2 réponses

Meilleure réponse

Remplacez simplement ^(https?:\\/\\/)?' par ^(https?:\\/\\/)', le ? signifie que vous voulez faire correspondre zéro ou une occurrence d'un motif. Vous voulez en fait exactement une occurrence, alors n'utilisez pas ? :)

À partir des expressions-régulières :

? - Rend l'élément précédent facultatif. Gourmand, donc l'élément optionnel est inclus dans le match si possible.

1
Michał Turczyn 14 mars 2019 à 12:43

Vous pouvez supprimer les caractères (...)?, il sera donc obligatoire d'avoir d'abord une séquence http ou https.

function testIfValidURL(str) {
  const pattern = new RegExp('^https?:\\/\\/' + // protocol
    '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
    '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
    '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
    '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
    '(\\#[-a-z\\d_]*)?$', 'i'); // fragment locator

  return !!pattern.test(str);
}

console.log(testIfValidURL('www.abcd.com'));
console.log(testIfValidURL('http://www.abcd.com'));
console.log(testIfValidURL('https://www.abcd.com'));
console.log(testIfValidURL('htt://www.abcd.com'));
1
Orelsanpls 14 mars 2019 à 12:44