probleme regex

Eléphant du PHP | 288 Messages

27 janv. 2009, 01:00

Bonjour

j'ai une regex qui fonctionne à moité. J'essaye de validé des numéros du genre
1-(555)-6566666
Pour celui-là ca marche mais j'aimerais aussi pouvoir accepter celui-ci
1-(555)-656-7777
1-(555)-65-67-777
1-(555)-6567-777
1-(555)-65 67 777
Voilà ce que j'ai fais:
/^[0-9]{1}[-. ]?\([0-9]{3}\)[-. ]?[0-9]{7}$/
.

c'est la dernière partie de la regex je n'arrive pas à modifier pour qu'il accepte les tirets ou les espaces à n'importe qu'elle endroit dans les 7 derniers chiffres.

Merci d'avance pour vos reponses.
Djibril

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 janv. 2009, 09:21

Pour ajouter un tiret dans une clase d'expression régulière, celui-ci doit être placé à la fin pour ne pas être confondu avec un interval entre deux caractères :)

Tu peux aussi utiliser le pipe | (altgr+6) pour proposer un caractère ou un autre : [a|b] correspond à soit "a", soit "b" :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 288 Messages

27 janv. 2009, 17:17

Merci pour ta réponse.

Mais j'y arrive toujours pas.

J'ai essaye ca:
/^[0-9]{1}[-. ]?([0-9]{3})[-. ]?[-. 0-9]{7}$/
ca marche pas et
/^[0-9]{1}[-. ]?([0-9]{3})[-. ]?[-. |0-9]{7}$/
marche pas plus.

Merci d'avance pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 janv. 2009, 18:03

Y a quelques petites choses qui ne vont pas...

- Les parenthèses, dans une expression régulière, servent à capturer des données. Si tu dois utiliser les caractères '(' ou ')' dans ton expression, il faut alors les échapper en les faisant préceder d'un antislash : '\(' ou '\)' , ainsi php considère qu'il s'agit de simple caractères.

- Le nombre de caractères : si tu mets des tirets ou des espaces en plus de tes 7 chiffres, tu ne peux pas conserver que 7 caractères ({7}). Il te faut donc soit étendre le nombre de caractères proposer (par exemple entre 7 et 9 : {7,9}) soit revoir le format de ton expression pour tester la présence potentiel de ces éléments à des endroits spécifiques...

Voici un exemple de pattern qui correspond aux exemples que tu as donné ci-dessus..
/^[0-9]{1}[ -]?\([0-9]{3}\)[ -]?[0-9 -]{7,9}$/
^ : la chaine doit commencer par
[0-9]{1} : un chiffre
[ -]? : suivi d'un espace, d'un tiret ou pas
\([0-9]{3}\) : suivi de 3 chiffres entre parenthèses
[ -]? : suivi d'un espace, d'un tiret ou pas
[0-9 -]{7,9} : suivi de 7 à 9 espaces, tirets ou chiffres
$ : et doit terminer la chaine.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 288 Messages

27 janv. 2009, 18:20

MErci encore pour ta reponse.

LEs parentheses sont belles et bien echappées dans mon code, j ai mal transcris dans le post. desolé.

Pour ce qui est de ta solution, j'avais déjà essayé ca mais elle me convient pas parce la je peux du coup mettre comme tu dis 7 à 9 espaces, tirets ou chiffres
alors qu'il faut absolument 7 chiffre et s'il y ait des espaces ou des tirets ou des points je m'en fous. Bon bien grand mot 55..---55 devrait pas arriver non plus. Je croyais que c'etais possible de regler ca avec les regex mais je crois il va falloir un peu de filtrage avant avec du code avant d'appliquer ma regex du debut.

Qu'est-ce que tu en penses.
Merci encore

Mammouth du PHP | 991 Messages

27 janv. 2009, 19:16

Je pense que tu as mal interprété la réponse ;)

Il y 7 - 9 espace (Espace spatial "conteneur") : composé de : chiffre ou tiré (Pas d'espace dans le sene "Barre d'espace".
DevOps, Symfony4, Hoa

Eléphant du PHP | 288 Messages

27 janv. 2009, 20:07

Non j'ai bien compris en fait ce que je veux dire c'est avec ca reponse

1-(555)-656-6666
va marché mais


1-(555)-65676666
va aussi marché et dans le 2eme cas il y a trop de chiffre.

Merci.

Mammouth du PHP | 991 Messages

27 janv. 2009, 20:12

Une solution de brute pourquoi ne pas faire un explode("-" , $maVar); et de compter le dernier résultat
et en déduire si cela est bon ou non.

Sinon je ne vois pas avec Regex.
DevOps, Symfony4, Hoa

Eléphant du PHP | 288 Messages

27 janv. 2009, 21:48

Merci

C'est ce que j'ai fais en faite quand je disais dans mon post précédent qu'il fallait d'abord filtré en brute et appliqué ma regex pour le reste, je parlais de faire quelque chose du genre.

Merci pour tout.
Je marque resolu.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]