Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Erreur dans une expression reguliere pour valider un nom de domaine (sans le suffix e)

18 réponses
Avatar
Bruno Baguette
Bonjour,

J'ai un soucis d'expression régulière pour vérifier la validité d'un nom
de domaine (sans le suffixe .be .eu et cie...).

if(preg_match('^(\[A-Z\d-]{1,63}$|^$)',$DomainName)==0)
{
array_push($Errors,'The domain name is invalid !');
}

Visiblement, l'expression régulière que j'ai faite n'est pas bonne.

Je cherche à vérifier que le nom de domaine soit d'une longueur de 1 à
63 caractères et ne soit constitué que de caractères légaux
(alphabétiques, tirets et chiffres).

Est-ce que vous auriez une idée de l'endroit où se situe mon erreur ?

D'avance un grand merci !

--
Bruno BAGUETTE - bouchon@alussinan.org

S'i'n'a è'ne saquî qui n'doit nin mârtchi, è'n mârtch'rè nîn.

--

10 réponses

1 2
Avatar
CrazyCat
Bruno Baguette wrote:
Bonjour,

J'ai un soucis d'expression régulière pour vérifier la validité d'un nom
de domaine (sans le suffixe .be .eu et cie...).

if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)
{
array_push($Errors,'The domain name is invalid !');
}


les lettres minuscules, les points....
[w.-]{1,63} semble meilleur non?


--
Tchattez en liberté: http://www.c-p-f.net
Tout sur les eggdrops: http://www.c-p-f.org
ML @

--

Avatar
Marc

if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)


la chaine doit etre bordée par un délimiteur non utilisé dans
l'expression ou "quoté".

--

Avatar
Cleo
if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)


Avec la clause "|^$" tu acceptes aussi les noms de domaine vide ?
si oui pourquoi ne pas mettre directement (^[wd-]{0,63}$) ?

--
Cléo.

--

Avatar
P'tit Marcel
Bruno Baguette wrote:

Bonjour,

J'ai un soucis d'expression régulière pour vérifier la validité d'un nom
de domaine (sans le suffixe .be .eu et cie...).

if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)


plutôt :
'|^[-a-z0-9]{1,63}$|i' (en prenant | comme délimiteur)

si tu veux être rigoriste, interdit le caractère - en première et
dernière position. En théorie (rfc1034), le premier caractère ne devrait
pas non plus être un chiffre, mais il y a pas mal d'exceptions...

--

Avatar
Daedalus
Bonjour,

J'ai un soucis d'expression régulière pour vérifier la validité d'un nom
de domaine (sans le suffixe .be .eu et cie...).

if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)
{
array_push($Errors,'The domain name is invalid !');
}

Visiblement, l'expression régulière que j'ai faite n'est pas bonne.

Je cherche à vérifier que le nom de domaine soit d'une longueur de 1 à
63 caractères et ne soit constitué que de caractères légaux
(alphabétiques, tirets et chiffres).

Est-ce que vous auriez une idée de l'endroit où se situe mon erreur ?




1- délimiteurs manquants: '/REGEXP/' ou encore '#REGEXP#'.
2- Le "[" d'ouverture est précédé d'un anti-slash qui fout ta classe de
caractère en l'air.

Suggestion:
if(!preg_match('/^[a-zd-]{1,63}$|^$/', $domain)){
array_push($Errors,'The domain name is invalid !');
}

Es-tu bien certain de ce "|^$" ?
Ceci veux dire que "" est aussi un nom de domaine valide, et que même
unset($domain) serait valid.
Je crois aussi que le "-" n'est pas valide comme premier et dernier
charactère du nom de domaine.

Dae

Avatar
nano
Bruno Baguette wrote:

Bonjour,

J'ai un soucis d'expression régulière pour vérifier la validité d'un nom
de domaine (sans le suffixe .be .eu et cie...).

if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)
{
array_push($Errors,'The domain name is invalid !');
}

Visiblement, l'expression régulière que j'ai faite n'est pas bonne.


Bruno,

L'expression suivante convient pour vérifier la validité formelle d'un
label au sens de RFC1034 ; le label devant comporter 63 caractères au
plus, commencer par une lettre et terminer par une lettre ou un chiffre,
avec des lettres et/ou des chiffres et/ou le caractère trait d'union
entre ces extrêmités.

(^[w][wd-]{0,61}[wd]{1}$)|(^[w]$)|(^$)

Le premier terme correspond au cas général, le deuxième et le troisième
terme correspondant respectivement aux cas particuliers que sont le
label constitué d'une seule lettre et la racine (je suis réservé pour
cette dernière).

qça,

JJS.

--

Avatar
Bruno Baguette
J.J.SOLARI wrote:

Bonjour JJS,

L'expression suivante convient pour vérifier la validité formelle d'un
label au sens de RFC1034 ; le label devant comporter 63 caractères au
plus, commencer par une lettre et terminer par une lettre ou un chiffre,
avec des lettres et/ou des chiffres et/ou le caractère trait d'union
entre ces extrêmités.

(^[w][wd-]{0,61}[wd]{1}$)|(^[w]$)|(^$)

Le premier terme correspond au cas général, le deuxième et le
troisième
terme correspondant respectivement aux cas particuliers que sont le
label constitué d'une seule lettre et la racine (je suis réservé pour
cette dernière).


J'ai testé ton expression régulière, cependant je recois ce warning avec
cette expression : Warning: Unknown modifier '|'

Le | étant le séparateur entre les différents termes de l'expression
régulière, je vois mal par quoi je devrais le remplacer.

De plus, cela n'accepte pas le label "levure" ou "yahoo", qui rentrent
pourtant dans le 1er terme de l'expression régulière.
if(preg_match('(^[w][wd-]{0,61}[wd]{1}$)|(^[w]$)|(^$)','levure')==0)
{
array_push($Errors,'The domain name is invalid !');
}

Bref, je reste encore coincé à ce sujet. (A moins que ca ne soit moi qui
ne l'utilise mal ?)

Une idée pour décoincer cela ?

D'avance merci !

--
Bruno BAGUETTE -

S'i'n'a è'ne saquî qui n'doit nin mârtchi, è'n mârtch'rè nîn.

Avatar
Bruno Baguette
Bonjour,

CrazyCat wrote:

Bruno Baguette wrote:

Bonjour,

J'ai un soucis d'expression régulière pour vérifier la validité d'un
nom de domaine (sans le suffixe .be .eu et cie...).

if(preg_match('^([A-Zd-]{1,63}$|^$)',$DomainName)==0)
{
array_push($Errors,'The domain name is invalid !');
}



les lettres minuscules, les points....
[w.-]{1,63} semble meilleur non?


Non.

Sauf erreur de ma part, un nom de domaine _SANS_ suffixe n'a pas à
contenir de point.

Concernant les minuscules, je passe la variable recue dans un strtolower
(je ne pensais pas utile de le préciser), donc ce problème est ainsi
évité. :-)

Bonne après midi :-)

--
Bruno BAGUETTE -

S'i'n'a è'ne saquî qui n'doit nin mârtchi, è'n mârtch'rè nîn.


Avatar
CrazyCat
Bruno Baguette wrote:
les lettres minuscules, les points....
[w.-]{1,63} semble meilleur non?


Sauf erreur de ma part, un nom de domaine _SANS_ suffixe n'a pas à
contenir de point.
La regexp fournie n'oblige pas le point mais l'autorise


Concernant les minuscules, je passe la variable recue dans un strtolower
(je ne pensais pas utile de le préciser), donc ce problème est ainsi
évité. :-)


Heu... pas du tout.
strtolower renvoit des minuscules, tu as 100% interêt à tester les
minuscules.

Bonne après midi :-)


idem :)


--
Tchattez en liberté: http://www.c-p-f.net
Tout sur les eggdrops: http://www.c-p-f.org
ML @


Avatar
Daedalus
J'ai testé ton expression régulière, cependant je recois ce warning avec
cette expression : Warning: Unknown modifier '|'

Le | étant le séparateur entre les différents termes de l'expression
régulière, je vois mal par quoi je devrais le remplacer.

De plus, cela n'accepte pas le label "levure" ou "yahoo", qui rentrent
pourtant dans le 1er terme de l'expression régulière.
if(preg_match('(^[w][wd-]{0,61}[wd]{1}$)|(^[w]$)|(^$)','levure')==0)
{
array_push($Errors,'The domain name is invalid !');
}

Bref, je reste encore coincé à ce sujet. (A moins que ca ne soit moi qui
ne l'utilise mal ?)


Le | n'est pas un bon séparateur car c'est le symbol du "logical or" (et il
n'est pas le séparateur dans le regexp que j'ai sous les yeux).
En fait, je ne vois pas de séparateur dans ta déclaration.
Voici une correction avec # comme séparateur :

if(preg_match('#(^[w][wd-]{0,61}[wd]{1}$)|(^[w]$)|(^$)#','levure')==0)
{
array_push($Errors,'The domain name is invalid !');
}

Encore quelques petits commentaire et intérrogations...
1- Je ne sais pas exactement dans quel contexte tu utilise cette expression
régulière, mais il y a de fortes chances que la partie |(^[w]$)|(^$) ne
s'applique pas à ton cas.
2- Dans [wd]{1}$, le {1} est inutile, bien qu'il ne cause aucun problème.
Problème du "word boundary" w :
3- Le "word boundary" w inclue le caractère _ qui à ma connaissance n'est
pas un caractère valide pour un nom de domaine.
4- Le w toujours, inclue aussi les chiffre alors une classe comme [wd]
est inutile et celle-ci [w] ne s'assure absoluement pas que le domaine
commence par une lettre.

Suggestion:
if(preg_match('#(^[^Wd_][a-z0-9-]{0,61}[^W_]$)#i','levure')==0)
{
array_push($Errors,'The domain name is invalid !');
}

Des classe comme celles-ci avec des négations d'une négation peuvent par
contre devenir un peu déroutantes si tu n'est pas un habitué des regexp.
Dans ce cas, tu pourrais tout aussi bien créer tes class de caractère en
spécifiant les caractères directement, ce qui n'est guère plus long dans ce
cas ci:
'#(^[a-z][a-z0-9-]{0,61}[a-z0-9-]$)#i' // i = case-insensitive, a = a
ou A


Dae

1 2