2010-08-03 6 views
5

J'ai une validation d'URL de base dans mon application. En ce moment j'utilise le code suivant.Validation d'URL - Accepte les URL sans protocoles

//validates whether the given value is 
//a valid URL 
function validateUrl(value) 
{ 
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
    return regexp.test(value); 
} 

Mais pour l'instant, il n'accepte pas les URL sans le protocole. Par ex. Si je fournis www.google.com, il ne l'accepte pas. Comment puis-je modifier le RegEx pour qu'il accepte les URL sans protocole?

+0

Merci pour toutes vos réponses. J'ai bien travaillé. – NLV

+0

Tous vos Regex acceptent @@ ## $$ comme URL valide. Des idées? – NLV

+0

NLV, vous n'avez pas spécifié que vous vouliez que nous corrigions votre regex, vous venez de demander comment le changer pour accepter n'importe quel protocole. En tout cas, voir ma nouvelle réponse ci-dessous qui donne une regex de validation d'URL complète (et complexe). –

Répondre

5

est ici un grand long regex pour une URL:

(?i)\b((?:(?:[a-z][\w-]+:)?(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 

La version élargie de ce (pour aider à rendre compréhensible):

(?xi) 
\b 
(       # Capture 1: entire matched URL 
    (?: 
    (?:[a-z][\w-]+:)?    # URL protocol and colon 
    (?: 
     /{1,3}      # 1-3 slashes 
     |        # or 
     [a-z0-9%]      # Single letter or digit or '%' 
            # (Trying not to match e.g. "URI::Escape") 
    ) 
    |       # or 
    www\d{0,3}[.]    # "www.", "www1.", "www2." … "www999." 
    |       # or 
    [a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash 
) 
    (?:       # One or more: 
    [^\s()<>]+      # Run of non-space, non-()<> 
    |        # or 
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels 
)+ 
    (?:       # End with: 
    \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels 
    |         # or 
    [^\s`!()\[\]{};:'".,<>?«»“”‘’]  # not a space or one of these punct chars 
) 
) 

Ces deux viennent de this page, mais légèrement modifié pour rendre le protocole correctement facultatif - vous devriez lire cette page pour vous aider à comprendre ce qu'il fait, et il a aussi une variante qui ne correspond qu'aux URL basées sur le Web, que vous pouvez aussi regarder.

+0

Merci pour votre effort. Laissez-moi vérifier. – NLV

+2

erreurs dans la console de chrome –

1

Marque protocole facultatif avec (...)?

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

Ceci déplace le ftp/http/https vers le groupe 2, et n'accepte pas les URL '// server'. –

+0

Regardez mon edit - maintenant il accepte 'protocole: //' ou '//' ou aucun d'entre eux. – hsz

+0

Vous pouvez également utiliser '(?: ...)' pour exclure un groupe des résultats. – hsz

1

Modifier la regex:

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

Comme pour la réponse de hsz, cela place le ftp/http/https dans le groupe 2 et n'accepte pas les URL '// server'. –

1

Je ne suis pas un expert en regex, mais entourant le protocole avec un autre support et en utilisant un point d'interrogation à la fin devrait le rendre facultatif:

function validateUrl(value) 
{ 
    var regexp = /((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ 
    return regexp.test(value); 
} 
+0

Encore une fois, si cette expression régulière a été utilisée pour capturer des parties d'URL, elle crée des groupes inutiles, et elle combine incorrectement le '//' avec le protocole, ce qui exclut les URL valides. –

+0

Bien que //google.com fonctionne, ce n'est pas une URL valide et je ne pense pas que la plupart des gens sachent que cela fonctionnerait et il peut donc être très utile d'exclure ces URL de la validation. Non pas parce que c'est possible, il doit être valide sous toutes ses formes. Les doubles barres obliques sont seulement quelque chose entre les deux puisque les points sont entre sous-domaine, domaine ou TLD. – 2ndkauboy

+0

Les doubles barres obliques sont le préfixe du chemin, tandis que les deux points sont le séparateur avec le protocole - ce sont deux parties distinctes qui se produisent juste ensemble. (Ceci est détaillé dans "3. Composants Syntaxiques URI" de la RFC 2396) L'utilisation de //google.com est un Url relatif valide (Encore une fois, voir l'annexe "C.1 Exemples normaux" de la RFC 2396) et il se produit "dans la nature". –

0

Modifier la première partie en:

(?:(ftp|http|https):)?(?:\/\/)? 

Le contenu de groupera (?: ... ) sans utiliser des groupes de capture (de sorte que le protocole réel reste dans le premier groupe).

Notez que les pièces protocol: et // sont individuellement facultatives - puisque //www.google.com est une URL (relative) valide.

+0

Le côlon ne dépend pas du protocole: http://tools.ietf.org/html/rfc2396 – 2ndkauboy

+0

Pas clair ce que vous dites là, et c'est un long document - pouvez-vous vous référer à la section spécifique dont vous parlez à? J'ai essayé (par exemple) ': // google.com' dans Chrome et IE et ça ne marche pas, même si on dirait que Firefox l'accepte. –

+0

La configuration du schéma inclut uniquement le nom du protocole (comme 'http', 'ftp') mais pas les deux-points. Donc même votre regex ne divise pas tous les groupes correctement. Mais comme NLV voulait seulement avoir une regex de validation pour une URL valide et commune (et pas seulement fonctionnelle), il n'est pas nécessaire d'utiliser un groupe autour des barres obliques. – 2ndkauboy

-1

peut vous valider ci-dessous .. url s'il vous plaît

http://www.youtube.com/http://www.youtube.com/watch?v=awP_PCb67Kk

+1

Notez que [les réponses de type lien uniquement] (http://meta.stackoverflow.com/tags/link-only-answers/info) sont déconseillées, les réponses SO doivent être l'aboutissement d'une recherche pour une solution (contre encore une autre escale de références, qui ont tendance à se périmer avec le temps). S'il vous plaît envisager d'ajouter un synopsis autonome ici, en gardant le lien comme référence. – kleopatra