ereg, vérifier dâte de naissance...

Mammouth du PHP | 531 Messages

10 juin 2008, 17:20

Bonjour,

Je fait quelques test en regex et je bloque sur ce code très simple... qui devrait fonctionner. J'ai pourtant pas l'impression de voir d'erreurs, mais si je passe 06/23/1987 il me retourne 1, soit une erreur.

Mais pourquoi php est-il aussi méchant ? :lol:
if ( !ereg( '([0-9]{2})/([0-9]{2})/([0-9]{4})', $date, $retour ) )
	{
		echo 1;
	}

Mammouth du PHP | 1668 Messages

10 juin 2008, 17:35

Tiré de php.net
<?php
if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {
    echo "$regs[3].$regs[2].$regs[1]";
} else {
    echo "Format de date invalide : $date";
}
?> 
Euh je viens de pensé à un truc, / ne doit-il pas être échapé ???
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 139 Messages

10 juin 2008, 17:43

il me semble qu'il faut les échapper oui
Pour ça, suffit de rajouter un \ devant; les / deviennent donc \/

Mammouth du PHP | 531 Messages

10 juin 2008, 17:49

En échappant le résultat est identique.

Je ne comprend pas l'exemple de php.net

Pourquoi au premier coups on teste le nombre de chiffres comme celà : {4}
et pour le reste comme ça : {1,2} ?

Je ne pense pas qu'il y est un rapport avec mon problème, mais on sais jamais...

Mammouth du PHP | 1668 Messages

10 juin 2008, 18:16

Eux, ils ont mis leur date dans l'autre sens (1980-04-28), bah je sais pas, ça ne t'inspire pas ???
...
...
...
Moi non plus :lol:
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Mammouth du PHP | 531 Messages

10 juin 2008, 18:23

Eux, ils ont mis leur date dans l'autre sens (1980-04-28), bah je sais pas, ça ne t'inspire pas ???
...
...
...
Moi non plus :lol:
bah euh non puisque j'ai fait l'inverse aussi dans le ereg :roll: :shock:

Mammouth du PHP | 1668 Messages

10 juin 2008, 18:50

C'est le principe qui compte, la forme compte plus que le font lors de l'aprentissage...
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

ViPHP
ViPHP | 4039 Messages

11 juin 2008, 10:06

hop hop, on va mettre un peu d'ordre la dedans :wink:

Alors, le {1,2} et le {4} ne sert en fait qu'a spécifier la répétition du caractère. [0-9]{1,2} validera tout chiffre de 1 ou 2 caractères, et [0-9]{4} que les chiffres de 4 caractères.

L'exemple sur php.net valide donc 1964/18/11 et 1947/1/3.

Pour ce qui est d'ereg, c'est mieux d'utiliser preg_match(), qui est plus rapide, et qui utilise une syntaxe compatible perl.

Tandis que le '/', non, il ne doit pas être échappé.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 531 Messages

11 juin 2008, 10:47

hummmm ok ça j'ai vient compris, enfin je crois.

mais donc ça : '([0-9]{2})/([0-9]{2})/([0-9]{4})'

Devrait accepter ceci par exemple ? : 12/12/2312

ViPHP
ViPHP | 4039 Messages

11 juin 2008, 12:23

Ouaip, et ça marche. En tout cas chez moi, dans mon regex testeur.

Pour la forme:
$pattern= "([0-9]{2})/([0-9]{2})/([0-9]{4})";
$match="azblabla blalva 12/54/1457 aazd";
preg_match($match,"#".$pattern."#",$matches);
print_r($matches);
(non testé, mais ça devrait aller)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
ViPHP | 1380 Messages

11 juin 2008, 12:35

Pour ce qui est d'ereg, c'est mieux d'utiliser preg_match(), qui est plus rapide, et qui utilise une syntaxe compatible perl.
+1

D'autant plus que la famille ereg sera définitivement abandonnée dans la prochaine version de PHP.
ripat

ViPHP
ViPHP | 4674 Messages

11 juin 2008, 23:13

Hey :),

Berzemus, tu te trompes. Le motif doit être placé en premier argument (voir la documentation).

Ensuite, est-ce que cette donnée provient d'un formulaire ? Si oui, il est sage de laisser l'utilisateur entrer n'importe quelle date (j'entends par là, n'importe quel format). Il existe diverses solutions, mais je ne vais pas les étaler si ce n'est pas ça ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 4039 Messages

12 juin 2008, 10:46

Berzemus, tu te trompes. Le motif doit être placé en premier argument (voir la documentation).
Non mais, tu m'as fait peur.. "au secours, un regex mal formulé ? une erreur fatale ? une mort certaine ?".. juste une question d'ordre dans les paramètres, alors le correct:
$pattern= "([0-9]{2})/([0-9]{2})/([0-9]{4})";
$match="azblabla blalva 12/54/1457 aazd";
preg_match("#".$pattern."#", $match, $matches);
print_r($matches); 
Pour une fois que je fais l'impasse sur php.net avant d'écrire..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.