Page 1 sur 1
ereg, vérifier dâte de naissance...
Posté : 10 juin 2008, 17:20
par supercanard
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 ?
if ( !ereg( '([0-9]{2})/([0-9]{2})/([0-9]{4})', $date, $retour ) )
{
echo 1;
}
Posté : 10 juin 2008, 17:35
par katagoto
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é ???
Posté : 10 juin 2008, 17:43
par Vurtu
il me semble qu'il faut les échapper oui
Pour ça, suffit de rajouter un \ devant; les / deviennent donc \/
Posté : 10 juin 2008, 17:49
par supercanard
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...
Posté : 10 juin 2008, 18:16
par katagoto
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

Posté : 10 juin 2008, 18:23
par supercanard
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

bah euh non puisque j'ai fait l'inverse aussi dans le ereg

Posté : 10 juin 2008, 18:50
par katagoto
C'est le principe qui compte, la forme compte plus que le font lors de l'aprentissage...
Posté : 11 juin 2008, 10:06
par Berzemus
hop hop, on va mettre un peu d'ordre la dedans
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é.
Posté : 11 juin 2008, 10:47
par supercanard
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
Posté : 11 juin 2008, 12:23
par Berzemus
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)
Posté : 11 juin 2008, 12:35
par Ripat
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.
Posté : 11 juin 2008, 23:13
par Hywan
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

.
Posté : 12 juin 2008, 10:46
par Berzemus
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..