regexp : téléphone

WRInaute passionné
Bonjour,

j'aimerais contrôler un champ téléphone de formulaire suivant les précisions suivantes :
- 7 chiffres au min (au max, je m'en fiche)
- que des chiffres
- 5 caractères spéciaux autorisés : -, _, ESPACE, /, .

J'ai trouvé cela :
Code:
/^0[0-9]([ .-]?[0-9]{2}){4}$/;
mais c'est sur 10 chiffres et ne correspond pas à mes caractères spéciaux

merci à vous
 
WRInaute accro
Bonjour

Je ne connais pas les regexp mode prcre, du moins pas le cas des évaluations conditionnelles suivant les valeurs déjà rencontrées.

Il faudrait au moins pouvoir mémoriser le nombre de chiffres, et peut-être aussi, des autres caractères ( ce que tu ne dis pas ).

Il faudrait une description formelle plus complète de la logique que tu souhaite, pour les numéros de téléphone.

Ou bien chercher sur Google... ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
merci à toi jf

et aussi medium ;-)

voici mes exemples de bons numéros :

01.02.03.04.05
01-02-03-04-05
01/02.03.04.05
01 02 03 04 05
0102030405

mais aussi

331.02.03.04.05
221-02-03-04-05
151/02.03.04.05
541 02 03 04 05

en gros tout ce que les gens ont l'habitude taper quand ils entrent des téléphones !
 
WRInaute accro
Bonjour

Dans ce cas, pour résoudre le problème, il me semble qu'il y a une condtion nécessaire et suffisante : C'est que tu sache et indique, toutes les possibilités de types de séquences de caractères, de manière exhaustive.

La deuxième option, serait de donner, une ou plusieurs formules ( mettons, algorithmiques ), pour valider un numéro de téléphone.

Dans le premier cas, il sera possible de fabriquer une regexp de type posix, répondant à ce que tu souhaites, simplement en faisant une construction du type :

"^(regexp1)|(regexp2)|(regexp3)|...|(regexpn)$"

Dans le deuxième cas, on verra ce qu'on peut faire... ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute impliqué
Il y a trop de formatages possible, c'est à toi d'imposer comment les numéros doivent être entrés et par regex tu boules tous les autres
 
WRInaute passionné
Une solution alternative autrement :

Dans un premier temps, tu ne garde que les chiffres.
Dans un second temps, tu vérifies qu'il y en est au moins 7.

Mais à mon avis, tu acceptes les N° de plusieurs pays avec ses conditions. donc fiabilité pas géniale.
 
WRInaute passionné
merci de vos avis.
@medium : oui c'est un site multinational

je pourrais faire peut etre un
$tel = eregi_replace("[^0-9]", "", $tel);
pour ne garder que les chiffres

mais ça ne résoudra pas le fait que si les gens tapent des lettres cela bugguera

et sachez que bcp tapent la lettre O à la place du 0 et j'en passe (j'ai vu passer une centaine de milliers de téléphone, donc je sais de quoi je parles)

ou alors bloquer les touches génantes dès le clic sur la touche mais c'est pas trop user friendly à mon goût
ex :

Code:
function valid_tel(evt) {
	var keyCode = evt.which ? evt.which : evt.keyCode;
	var interdit = 'azertyuiopqsdfghjklmwxcvbnàâäãçéèêëìîïòôöõùûüñ -+&*?!:;.,\t#~"^¨%$£?²¤§%*()[]{}<>|\\/`\'';
	if (interdit.indexOf(String.fromCharCode(keyCode)) >= 0) {
		return false;
	}
}
 
WRInaute passionné
Dans ce cas, un premier contrôle sommaire pour voir que le tel ne contient que des caractères autorisés.

Un second traitement, tu ne garde que les chiffres.

3eme traitement, deux options :
:arrow: Tu contrôle un minimum de 7 chiffres.
:arrow: Tu contrôle le nombre de chiffre en relation avec le format du pays concerné (y compris numérotation internationale 033 pour la France il me semble)

Tu ne peux pas faire vraiment autre chose...
 
WRInaute passionné
merci jacques je vais le tester.

juste une ptite question bébéte : en js ça donne quoi car il y a des caractères à échapper non ?
 
WRInaute accro
rudddy a dit:
merci jacques je vais le tester.

juste une ptite question bébéte : en js ça donne quoi car il y a des caractères à échapper non ?


Le caractère point ( . ) dans une regexp, signifie n'importe quel caractère.

Il faut donc échapper le point ( \. au lieu de . ).

Quant au reste : l'underscore _ je ne crois pas mais ça ne mange pas de pain, le tiret en début de regexp pas besoin ( mais besoin d'échapper le tiret - en \- si ailleurs qu'en tout début de regexp, sinon c'est un intervalle de caractères. )

Je crois qu'il faut échapper le slash aussi ( \/ au lieu de / ), mais je ne suis pas sûr qu'il ne faille pas mettre : // au lieu de / J'ai un doute à propos des regexp du logiciel awk.

Enfin bref, j'ai pas encore l'Alzeihmer, mais ça ne saurait tarder... ;)

Et puis, il n'y a théoriquement pas de problème à échapper tout qui lève un doute, vu que par exemple, dans une regexp, \a est équivalent à a

Mes deux cents...

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
Non, dans une classe (entre des crochets []), le . est un caractère comme un autre, tout comme ?, *, etc.

Les seuls caractères qui ont une signification particulière sont le - (qui doit toujours être au début, sinon c'est une étendue genre A-Z), le \ (qui en PCRE sert à introduire certaines séquences type \d, \w, etc, et qui doit être échappé), le ] évidemment (à échapper), ^ en début de classe (négation, à échapper), et probablement [ (début de [:pseudoclasse:])

Evidemment le / doit toujours être échappé s'il est utilisé comme délimiteur, ce qui est forcément le cas en JS il me semble, non?

Jacques.
 
WRInaute passionné
alors là :

merci jf ta regex c'est du feu atomique
et merci jcaron, il fallait effectivement échapper le \

Merci vous êtes des tueurs
j'ai un dilemme à qui mettre la reco :-(

on peut pas en mettre 2 ?
 
WRInaute accro
jcaron a dit:
Non, dans une classe (entre des crochets []), le . est un caractère comme un autre, tout comme ?, *, etc.


Bonjour

Au risque de sembler un peu têtu, il semble que dans le cas des regexp type prcre, il ne soit pas nécessaire que la regexp soit entre [ ] pour que les caractère spéciaux soient considérés comme tels.

Par contre, dans une regexp type posix ( c'est probablement le cas, si c'est en JS ), c'est le cas.

Enfin, je crois ( merci de me contredire si c'est faux pour du pcre ) que, que ce soit pour du posix ou du pcre, le point est un caractère spécial signifiant : n'importe quel caractère.

J'ai cru comprendre que ce problème se posait dans un contexte Javascript, dans ce cas, ces regexp ne sont-elles pas toujours du type posix ?

A part çà, pour du php et autres langages, celà dépend des instructions choisies ( posix ou pcre ), mais la regexp donnée ci-dessus, est de la norme pcre.

...Maintenant, j'attends le verdict : Alzeihmer, pas Alzeihmer ? ;)

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
Il n'est pas nécessaire de mettre les caractères spéciaux dans des [], mais dans des [], la plupart (.?*+{} etc.) ne sont pas interprétés de la même façon, et c'est normal (ça ne voudrait pas dire grand chose). C'est valable aussi bien en PCRE qu'en POSIX. Pareil, dans les deux cas, on peut utiliser des \ pour escaper ces caractères en dehors des [].

A l'intérieur de [], la différence entre les deux va concerner les séquences \x qui n'existent pas et \ ne peut pas être utilisé pour escaper en POSIX (alors qu'il peut l'être en PCRE).

re_format(7) a dit:
To include a literal `]' in the list, make it the first character (fol-
lowing a possible `^'). To include a literal `-', make it the first or
last character, or the second endpoint of a range. To use a literal `-'
as the first endpoint of a range, enclose it in `[.' and `.]' to make it
a collating element (see below). With the exception of these and some
combinations using `[' (see next paragraphs), all other special charac-
ters, including `\', lose their special significance within a bracket
expression.

La regex fournie plus haut doit normalement fonctionner aussi bien en POSIX qu'en PCRE, aux délimiteurs près (qui dépend plus du langage que de l'implémentation, réellement).

Jacques.
 
WRInaute accro
medium69 a dit:
jcaron a dit:
'#[-0-9_ /.]{7,}#'

Attention, avec ce cas de figure, il accepte 7 caractères au minimum ; pas seulement 7 chiffres au minimum ;)

En effet. Si on veut absolument avoir 7 chiffres, il faut faire un peu plus compliqué, par exemple:

#([0-9][-_ /.]*){7,}#

(c'est une simplification, elle permet d'avoir les autres caractères entre les chiffres et à la fin, mais pas au début, si on veut vraiment être tatillon on ne les permettra probablement qu'entre les chiffres, ou alors entre, à la fin mais aussi au début).

Mea culpa :)

Jacques.
 
WRInaute passionné
jcaron a dit:
medium69 a dit:
jcaron a dit:
'#[-0-9_ /.]{7,}#'

Attention, avec ce cas de figure, il accepte 7 caractères au minimum ; pas seulement 7 chiffres au minimum ;)

En effet. Si on veut absolument avoir 7 chiffres, il faut faire un peu plus compliqué, par exemple:

#([0-9][-_ /.]*){7,}#

(c'est une simplification, elle permet d'avoir les autres caractères entre les chiffres et à la fin, mais pas au début, si on veut vraiment être tatillon on ne les permettra probablement qu'entre les chiffres, ou alors entre, à la fin mais aussi au début).

Mea culpa :)

Jacques.
non chez moi ça fonctionne nickel : http://www.les-maisons-de-retraite.com/EHPAD-alzheimer.html
:wink:
teste en ne travaillant que sur la champ tél stp
 
WRInaute accro
Ce qu'il veut dire, c'est que tu peux taper 1-----2 et que ça va passer (il y a 7 caractères qui correspondent à ce qui est autorisé, mais il n'y a que 2 chiffres). Si tu veux qu'il y ait absolument au moins 7 chiffres (sans compter les autres caractères), l'autre regex est plus stricte.

Jacques.
 
Discussions similaires
Haut