55 votes

Valider une url avec jQuery sans le plugin validate ?

J'ai besoin de valider une url dans variable avec jQuery, mais je ne peux pas utiliser validate-plugin. Existe-t-il un moyen simple de le faire ?

141voto

Nick Craver Points 313913

Vous pouvez utiliser le même regex que celui du plugin de validation (mis à jour avec le dernier regex le 23 mai 2015) :

function isUrlValid(url) {
    return /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(url);
}

var testCases = [
    "http://www.google.com/",
    "https://www.google.com/",
    "ftp://www.google.com/",
    "http://google.com/",
    "http://google.com",
    "https://google.com",
    "http://www.google.com:80/",
    "https://www.google.com:443/",
    "http://127.0.0.1/",
    "http://127.0.0.1:9200/",
    "www.site.com",
    "x:",
    "http://",
    "javascript:alert('xss')",
    "http://w",
    "http:",
    "derp://www.google.com",
    "http://localserver"
],  div = document.getElementById("output");

for(var i=0; i < testCases.length; i++) {
    var test = testCases[i];
    div.innerHTML += (isUrlValid(test) ? "<span class='valid'>valid</span>:   " : "<span class='invalid'>invalid</span>: ") + "" + test + "\n";
}

.valid { color: green; }
.invalid { color: red; }

<pre id="output"></pre>

Il gère l'unicode, etc. et est donc un peu verbeux. La source est le plugin de validation lui-même . Quelques remarques : c'est probablement ce que vous voulez mais il n'est pas strictement correcto . En général, vous devez choisir une expression rationnelle légèrement différente si vous voulez accepter des choses comme http://w y http://localserver qui sont valables dans un environnement intranet mais qui ne sont généralement pas autorisés dans la plupart des formulaires web. D'une certaine manière, cette regex est plus sûre, car elle nécessite un paramètre FQDN dans de tels cas. De même, d'autres exemples comme les protocoles personnalisés sont rejetés ici, mais sont valables et fonctionnent pour de nombreuses choses utilisées aujourd'hui. Si vous demandez aux utilisateurs "Quelle est votre page d'accueil ?" dans un formulaire, vous voudrez probablement les exclure de toute façon.

Si vous trouvez ceci plus tard : n'hésitez pas à tester d'autres cas de test avec le snippet que j'ai inclus et mettez à jour la réponse si vous pensez qu'un nouveau cas commun devrait être mentionné. J'ai réécrit la réponse avec la dernière regex et dans ce format pour mieux servir la communauté.

3 votes

Cela a très bien fonctionné. Simple aussi. J'aimerais que vous puissiez développer la réponse pour montrer l'option d'ajout automatique de http:// ?

1 votes

De plus, il accepte "derp://www.google.com" comme une url valide.

0 votes

@user1063287 ce sont des URLs valides, je peux avoir un serveur nommé w . Seul un nom d'hôte n'est pas une URL valide.

35voto

Ersin Demirtas Points 141

Merci beaucoup Meo et Nick, j'ai mis vos deux réponses ensemble et cela fonctionne parfaitement.

if(/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test($("#url").val())){
    alert("valid URL");
} else {
    alert("invalid URL");
}

9voto

Abdo Host Points 9
var url = $('input.surl').val();
var url_validate = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
if(!url_validate.test(url)){
   alert('error');
}
else{
   alert('success');
}

0 votes

Vous devez utiliser var avant de définir le mot-clé url_validate variable

0 votes

Merci @Amaanwarsi

0 votes

Vous êtes les bienvenus

6voto

meo Points 10534

Oui avec une regex :

/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix

3voto

Vishnu Sharma Points 479

vous voulez valider votre URL :

S'il vous plaît passer l'URL dans cette fonction alors cela vous donnera vrai OU faux .

Voir Fonction :

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

isUrl(yourURL);
</script>

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