2010-08-23 3 views
1

Je veux valider l'URL (en utilisant le script Java) pour accepter uniquement le format - http://www.test.com. J'essaie le code suivant, mais il accepte aussi test.com et http://www.test.com.com.valider l'URL sous la forme http://www.test.com

var URLReg = new RegExp(); 
URLReg.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$"); 
if (!URLReg.test(form["URL"].value)) { 
    alert("You must supply a valid URL."); 
    return false; 
} 

Qu'est-ce qui ne va pas? :(

Merci à l'avance

+8

Pourquoi 'http: // www.test.com' est-il valide alors que' http: // test.com' ou 'http: // www.test.com.com' ne l'est pas? Qu'est-ce qui le rend "plus valide" que les autres? Souhaitez-vous tester 'http: // stackoverflow.com /'? –

+4

pour ajouter à ce que dit @Joachim. 'www.test.com.com' est une URL valide, pourquoi voulez-vous l'interdire? –

+0

@KukePHP: Je pense qu'il y a aussi une erreur sintaxe dans votre code, puisque vous créez la regex dans une chaîne, vous avez oublié la double barre oblique inverse \\ avant le '?' et avez-vous besoin de la barre oblique inverse avant la barre oblique '/'. La dernière partie de votre regex: "... [A-Za-z0-9 _/\\ - \\% \\ & \\? \\. \\ =] +" Peut-être que j'ai même ajouté trop de backslashs non nécessaires à présent. Mais juste au cas où. :) –

Répondre

0

i utilise cette expression - est le meilleur que j'ai trouvé.

^(https?://)?(([\w!~*'().&=+$%-]+:)?[\w!~*'().&=+$%-][email protected])?(([0-9]{1,3}\.){3}[0-9]{1,3}|([\w!~*'()-]+\.)* 
([\w^-][\w-]{0,61})?[\w]\.[a-z]{2,6})(:[0-9]{1,4})?((/*)|(/+[\w!~*'().;?: 
@&=+$,%#-]+)+/*)$ 
0

Voir si

^[A-Za-z]+:\/\/[A-Za-z0-9-/]+\.com$ 

est ce que vous voulez

5

Si vous voulez coller partiellement à votre code une solution rapide pourrait simplement utiliser ceux-ci:

"^((https?\\://www\\.)|(www\\.))[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-\\%\\&\\?\\.\\=\\+]+$" (accepte "http://www ...." et "www ...")

ou

"^(https?\\://www\\.)[A-Za-z0-9_\\-]+\\.[A-Za-z0-9_\\-\\%\\&\\?\\.\\=\\+]+$" (accepte uniquement les "http://www ...." et non "www ...")

Ni l'un ni l'autre n'accepte un domaine sans "www".

Quoi qu'il en soit votre code (et le code I ajusté placé au-dessus) est MAUVAIS parce qu'ils seraient tous deux valider domaines ok comme ceux-ci:

Votre regex accepte également une merde comme celle-ci:

  • acclamations: // www ...

Pour valider seulement la partie de domaine (www forcer à entrer) vous pouvez utiliser ceci:

var URLReg = /^((https?\://wwww\.)|(www\.))([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+$/i; 

Celui-won ne pas valider ok merde comme:

BTW: Il validerait également http://www.domain.com.com mais ce n'est pas une erreur car une url sous-domaine pourrait ressembler à: http://www.subdomain.domain.com et il est valide! Et il n'y a presque aucun moyen (ou du moins pas de façon opérationnelle moyen facile) à validate pour un bon domaine tld avec une expression régulière parce que vous auriez à écrire en ligne dans votre regex tous les TLDs de domaine possibles UN PAR UN comme ceci:

var URLReg = /^((https?\://wwww\.)|(www\.))([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+(com|it|net|uk|de)$/i; 

(ce dernier par exemple validerait seul domaine se terminant par .com/.net/.de/.it/.co.uk) Nouveaux TLDs toujours sortir, vous devez donc régler vous regex everytimne un nouveau tld sort, c'est bizarre!


Afin de valider aussi la partie restante d'une URL, vous pouvez ajouter la partie remainig à la fin de la regex:

var URLReg = /^((https?\://wwww\.)|(www\.))([a-z0-9]([a-z0-9]|(\-[a-z0-9]))*\.)+[a-z]+(\/[a-z0-9_\-\%\&\?\.\=\+]*)*$/i;

Il est toujours pas parfait car Somone pourrait entrer:

http://www.domain.com/????hello

et validerait ok, mais maintenant je suis fatigué, désolé! :)