Version complète: sur le forum Webmaster Hub : Expression Régulière
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > Asp, Java, Cfm, autres.
Portekoi
Bonjour,

Je travaille actuellement en Dotnet.

Je cherche le moyen de contrôler la validité d'une url en retournant True ou False :

www.google.fr = True
images.google.fr = True

test.php = False
test.test.php = False

Quelqu'un aurait il ca sous la main?

Merci smile.gif


Portekoi
Kent
Salut, tu cherche la regex en elle même ou une façon de faire ?

tu utilise quel langage en dotnet ?

sous c# tu peut faire une regex en faisant un "using System.Regularexpression"

ensuite tu test si la valeur entré correspond à une regex.

Voici comment je fais pour ma part :

CODE
Regex r = new Regex("http://([\\w-]+\\.)+[\\w-]+");
mc = r.Matche(codeSource);


CODE
http://([\\w-]+\\.)+[\\w-]+
, cherche la correspondance en testant tout les format d'url existant

remplate "codeSource" par zonedesaisie.text par exemple

une autre variante trés "primitive" serait :

CODE
@([http://]?)@([www.]?)(.*)@((.)(fr|info|com|org|net|asso)(/?))
Portekoi
Je suis en VB.net

Le problème, c'est que l'on force le http:// alors qu'il n'y est pas toujours smile.gif
Kent
l'instruction "?" te permet de rendre le groupe facultatif :

exemple :

CODE
http://([\\w-]+\\.)+[\\w-]+


deviendré
CODE
([http://]?)([\\w-]+\\.)+[\\w-]+


Essai comme ça smile.gif
Portekoi
marche pas non plus sad.gif

CODE

Function ISlinKExternal1(ByVal Url As String, ByVal Hostname As String)
Dim page As String

page = "http://" & LCase(Trim(Mid(Url, InStrRev(Url, "/") + 1)))

Dim objIntPattern As New System.Text.RegularExpressions.Regex("([http://]?)([\\w-]+\\.)+[\\w-]+")
MsgBox(objIntPattern.IsMatch(page).ToString & " - " & page)
Return objIntPattern.IsMatch(Url)
End Function
Kent
l'erreur se situe à quel niveau ? une exception ?

C'est la regex qui est incorrecte ?

Je viens de retrouver une vieille regex un peu basic mais tu peut toujours l'essayé :

http://(www.([a-zA-Z0-9]*|[-_]*)|([a-zA-Z0-9]*|[-_]*))(.net|.fr|.com|.net/|.fr/|.com/)
Portekoi
Il me retourne false pour www.google.fr et http://www.google.fr

Je ne sais pas d'où cela viens sad.gif
Kent
CODE
page = "http://" & LCase(Trim(Mid(Url, InStrRev(Url, "/") + 1)))


Peut-être à cause de ça tu enleve le dernier aslash ? tu y fais quoi je saisi pas bien

Quand tu mets les http:// et que tu test avec cette regex


CODE
http://([\\w-]+\\.)+[\\w-]+


ça donne quoi ?
Portekoi
En faites, le but pour moi, c'est qu'avec se style d'URL :

http://www.monsite.com/tartanpion/coucou/www.google.com

J'isole la chaîne : www.google.com

Et je vérifie si c'est une url ou non smile.gif

Même résultat avec http://([\\w-]+\\.)+[\\w-]+ sad.gif
Kent
Je crois qu'il vas falloir effectué les procedure de deboguage savoir si ça viens de la regex ou avant

fais un pas à pas.

verifie le contenu de page si tu as bien le nom de domaine uniquement. Ainsi tu vérifiera s'il a bien la forme d'une url.
isMatch ne te retourne pas true si la forme n'a effectivement pas de correspondance avec la regex.

En clair vérifie la forme de page apres tes Lcase Mid et Trim

Sinon essaie celle-ci

CODE
^(http://|https://){0,1}[A-Za-z0-9][A-Za-z0-9\-\.]+[A-Za-z0-9]\.[A-Za-z]{2,}[\43-\176]*$


Trouvé ici

* Function ValidationURL(url)
* Dim modele
* set modele = New RegExp
* modele.pattern = "^(http://|https://){0,1}[A-Za-z0-9][A-Za-z0-9\-\.]+[A-Za-z0-9]\.[A-Za-z]{2,}[\43-\176]*$"
* modele.global = true
* ValidationURL = modele.test(url)
* End Function

C'est de l'asp mais les formats de regex sont les mêmes (microsoft oblige)
Portekoi
Re,

Cela me renvoi "True" même pour test.php ou http://test.php

sad.gif


Portekoi
Kent
regarde ici , http://www.labo-dotnet.com/articles/Csharp...sharp/0/45.aspx

Il y'a des explications et des exemples pour les Regex

Mais que contient "page" après ton traitement ? cette partie est ok ?
Portekoi
Page contient "www.google.fr" puis "test.test.php" par exemple

Je me rends compte que c'est quasi-impossible à faire. J'ai arpenté pas mal de site et je n'ai rien trouvé...

Pas grave, on va faire autrement smile.gif

Merci en tout cas
KaRaK
Bonsoir,

Deux idées me viennent à l'esprit en lisant ce topic.

1- Faire un test sur ce qui se situe après le deuxième point et vérifier si l'extension appartient à une liste d'extensions que tu as identifiées comme nom de domaine : .fr . com etc.

2 - Envoyer une requête sur éventuel domaine puis voir si il répond correctement.
Portekoi
Bonjour,

1 - Oui je me suis dis que j'allais faire comme ca mais comme c'est pour un logiciel, je vais me retrouver coincer s'il y a une nouvelle extension

2 - J'ai aussi essayé. J'ai trouve HttpWebRequest.

A voir smile.gif

Merci


Portekoi
Kent
Rebonjour , voici un coup de main pour httpWebRequest

CODE

public static string ouvrirUrl(string url)
{
HttpWebResponse HttpWResponse = null;
StreamReader sr = null;
try
{
HttpWebRequest HttpWRequest = (HttpWebRequest)WebRequest.Create(url);
HttpWResponse = (HttpWebResponse)HttpWRequest.GetResponse();
// Tu peut ici testé si HttpWResponse retourne quelque chose different de null
}
catch (Exception ex)
{
string Erreur = "Impossible d'éffectuer l'operation : " + ex.ToString();
return Erreur;
}
Portekoi
Et bien ca continue...

Voici mon code :
CODE

Try
'Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create("http://monserveur/damien/url/index.html"), HttpWebRequest)

'Get the associated response for the above request.
Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
myHttpWebResponse.Close()
Catch f As WebException
Console.WriteLine(f.Message & "<--")

If f.Status = WebExceptionStatus.ProtocolError Then
Console.WriteLine("Status Code : {0}", CType(f.Response, HttpWebResponse).StatusCode)
Console.WriteLine("Status Description : {0}", CType(f.Response, HttpWebResponse).StatusDescription)
End If

Catch f As Exception
Console.WriteLine(f.Message & "<--")
End Try


Mais j'ai cette erreur lors de l'exécution :
Une exception de première chance de type 'System.Net.WebException' s'est produite dans System.dll

EDIT : Apparemment, il me renvoie une erreur 401 pour mon site et avec google, j'ai une erreur de type 407 (proxy). Je pense savoir d'où sa viens smile.gif
Portekoi
Re,

J'ai ajouté ceci et tout fonctionne maintenant :
CODE
Dim myHttpWebRequest As HttpWebRequest
            myHttpWebRequest = CType(WebRequest.Create("http://www.google.fr"), HttpWebRequest)

            myHttpWebRequest.Proxy = System.Net.WebProxy.GetDefaultProxy
            myHttpWebRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
Kent
Tu peut donc maintenant évaluer la validité d'une url tout simplement si elle reponds à une requette http plutôt que dans sa syntaxe ?
Portekoi
Tout à fait mais je dois gérer aussi le StatusCode.

Je continue happy.gif
Kent
Bonne continuation groupwave.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.