par
Ryle » 28 janv. 2008, 17:26
Oups, effectivement, je n'ai fait que survolé le sujet et je pensais que tu étais passé au pcre avec preg_match() et n'ai pas fait attention au fait que tu continuais d'utiliser ereg()
Pour ton expression, elle n'est pas encore bonne mais tu es sur la bonne voie. Il faut faire attention au fait que certains caractères ont une signification bien particulière. Le point correspond à n'importe quel caractère, l'étoile quant à elle est un quantificateur, elle indique que l'élément peut être présent de 0 à N fois. Ainsi " .* " signifie n'importe quel caractère de 0 à N fois et ce n'est pas assez précis pour déterminer ton adresse ip. Tu pourrais donc préciser qu'il s'agit d'un véritable point en l'échapant avec un antislash " \.". Ton masque ressemblerait alors à :
#10\..*\..*\..*#
Mais il suffit d'avoir un 10 et quelques points dans une phrase pour que ce masque corresponde à d'autres chaines (genre, "En français j'ai eu
10. En math 12. Et une bulle en sport...." et hop, on est dans le masque

).
Il existe de nombreux masques pouvant correspondre à une adresse ip, pouvant être plus ou moins précis (vérifiant par exemple que chaque nombre est comprit entre 0 et 255), donc tout dépend du contexte et de ce que tu as autour. Voici une suggestion pour essayer de t'expliquer un peu comment on construit un masque :
Supposons que le format de l'ip que tu cherches soit "10.xxx.xxx.xxx" : le nombre 10, suivit d'un point, suivit de 1 à 3 chiffres, suivient d'un point, suivit de 1 à 3 chiffres, suivient d'un point, suivit de 1 à 3 chiffres.
L'idée est donc de définir un masque qui corresponde à ce format (je ne vais pas vérifier que les nombres sont inférieurs à 256, etc. mais tu pourras toujours t'amuser à essayer de le faire)
On recherche donc à l'intérieur de ta chaine une sous-chaine avec un "10" suivit d'un point : #10\.#
puis l'on doit trouver un chiffre (on va utiliser une classe autorisant les caractères de 1 à 9) : #[0-9]#
Et l'on veut que ce chiffre n'apparaisse que de 1 (minimum) à 3 fois (maximum) : #[0-9]{1,3}#
Et cela 3 fois
En assemblant tout ça, notre masque va donc ressembler à
#10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#
Que l'on peut également écrire ainsi :
#10(\.[0-9]{1,3}){3}#
Edit : bon ben grillé, mais maintenant que c'est écrit, je l'poste quand même 
Oups, effectivement, je n'ai fait que survolé le sujet et je pensais que tu étais passé au pcre avec preg_match() et n'ai pas fait attention au fait que tu continuais d'utiliser ereg()
Pour ton expression, elle n'est pas encore bonne mais tu es sur la bonne voie. Il faut faire attention au fait que certains caractères ont une signification bien particulière. Le point correspond à n'importe quel caractère, l'étoile quant à elle est un quantificateur, elle indique que l'élément peut être présent de 0 à N fois. Ainsi " .* " signifie n'importe quel caractère de 0 à N fois et ce n'est pas assez précis pour déterminer ton adresse ip. Tu pourrais donc préciser qu'il s'agit d'un véritable point en l'échapant avec un antislash " \.". Ton masque ressemblerait alors à :
[php]#10\..*\..*\..*#[/php]Mais il suffit d'avoir un 10 et quelques points dans une phrase pour que ce masque corresponde à d'autres chaines (genre, "En français j'ai eu [i]10. En math 12. Et une bulle en sport..[/i].." et hop, on est dans le masque :)).
Il existe de nombreux masques pouvant correspondre à une adresse ip, pouvant être plus ou moins précis (vérifiant par exemple que chaque nombre est comprit entre 0 et 255), donc tout dépend du contexte et de ce que tu as autour. Voici une suggestion pour essayer de t'expliquer un peu comment on construit un masque :
Supposons que le format de l'ip que tu cherches soit "10.xxx.xxx.xxx" : le nombre 10, suivit d'un point, suivit de 1 à 3 chiffres, suivient d'un point, suivit de 1 à 3 chiffres, suivient d'un point, suivit de 1 à 3 chiffres.
L'idée est donc de définir un masque qui corresponde à ce format (je ne vais pas vérifier que les nombres sont inférieurs à 256, etc. mais tu pourras toujours t'amuser à essayer de le faire)
On recherche donc à l'intérieur de ta chaine une sous-chaine avec un "10" suivit d'un point : #10\.#
puis l'on doit trouver un chiffre (on va utiliser une classe autorisant les caractères de 1 à 9) : #[0-9]#
Et l'on veut que ce chiffre n'apparaisse que de 1 (minimum) à 3 fois (maximum) : #[0-9]{1,3}#
Et cela 3 fois
En assemblant tout ça, notre masque va donc ressembler à
[php]#10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#[/php]
Que l'on peut également écrire ainsi :
[php]#10(\.[0-9]{1,3}){3}#[/php]
[size=75]Edit : bon ben grillé, mais maintenant que c'est écrit, je l'poste quand même ;)[/size]