744 votes

Qu'est-ce qu'une bonne expression régulière pour correspondre à une URL?

Actuellement, j'ai une zone de saisie qui détectera l'URL et analysera les données.

Donc maintenant, j'utilise:

 var urlR = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)
           (?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url= content.match(urlR);
 

Le problème est que, lorsque je saisis une URL comme www.google.com , cela ne fonctionne pas. quand j'ai entré http://www.google.com , cela fonctionne.

Je ne parle pas très bien les expressions régulières. Quelqu'un peut-il m'aider?

1048voto

Daveo Points 5117

Regex si vous voulez vous assurer que l'URL commence par HTTP

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)

si vous n'avez pas besoin d'utiliser http

[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)

pour en faire l'essai, voir http://regexr.com?37i6s ou pour une version moins restrictive http://regexr.com/39i0i

Exemple d'implémentation JavaScript

 var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
 var regex = new RegExp(expression);
var t = 'www.google.com';
  if (t.match(regex) )
 {
   alert("Successful match");
 } else {
   alert("No match");
 }
 

409voto

foufos Points 31
(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})

Va correspondre les cas suivants

  • http://www.foufos.gr
  • https://www.foufos.gr
  • http://foufos.gr
  • http://www.foufos.gr/kino
  • http://www.t.co
  • http://t.co
  • http://werer.gr
  • www.foufos.gr

Ne correspond PAS à la suivante

  • www.foufos
  • http://www.foufos
  • http://foufos

Vérifier dans rubular

66voto

Michael Connor Points 723

Ce sont les droïdes que vous recherchez. Cela provient de validator.js qui est la bibliothèque que vous devriez vraiment utiliser pour faire cela. Mais si vous voulez rouler le vôtre, qui suis-je pour vous arrêter? Si vous voulez une regex pure, vous pouvez simplement retirer le contrôle de longueur. Je pense que c'est une bonne idée de tester la longueur de l'URL si vous voulez vraiment déterminer la conformité à la spécification.

  function isURL(str) {
     var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
     var url = new RegExp(urlRegex, 'i');
     return str.length < 2083 && url.test(str);
}
 

48voto

Amar Palsapure Points 7025

Une autre solution possible, solution ci-dessus a échoué pour moi dans l'analyse syntaxique des paramètres de chaîne de requête.

 var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\\/\\/(www\\.)?|www\\.){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");

if(regex.test("http://google.com")){
  alert("Successful match");
}else{
  alert("No match");
}
 

Dans cette solution, n'hésitez pas à modifier [-0-9A-Za-z\.@:%_\+~#= , afin de faire correspondre le nom de domaine / sous-domaine. Dans cette solution, les paramètres de chaîne de requête sont également pris en compte.

Si vous n'utilisez pas RegEx , remplacez \\ par \ par l'expression.

J'espère que cela t'aides.

10voto

Roman Points 360

essaye ça

 (ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X