Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/02/2011, 20h50   #1
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Par défaut regexp qui accepte les caractères numériques et les tirets

Bonsoir,

j'ai une regexp qui sert à contrôler un champ de saisie d'un numéro de téléphone, mais actuellement, elle n'accepte que les caractères numériques (éventuellement précédés par un + ou un -. Or je voudrais qu'elle accepte aussi les tirets et les espaces. Comment adapter la regexp suivante :
Code :
1
2
3
4
5
6
var re2 = /^[+-]?\d+(\.d+)?(e[-+]?\d+)?$/i;
if( !re2.test( objForm.officenumber.value ) )
    {
      alert( "The field \"officenumber\" must contain a decimal value !" );
      return false;
    }
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 14h58   #2
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
devrait convenir pour un numéro de téléphone français, avec un tiré comme séparateur
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 15h47   #3
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Merci,

je crois la comprendre alors que je ne comprenais pas la précédente.
D'ailleurs, une question : le [+-] ne signifie-t-il pas qu'un + ou un - peut être mis optionnellement au début ?
Mais petit bémol : ça ne serait pas que pour des numéros français (notamment, autoriser les numéros américains qui peuvent être du type 123-456-789 (je crois, pas sûr), et le séparateur est optionnel (ça peut être un tiret ou un espace ou rien)
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 16h32   #4
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
Citation:
une question : le [+-] ne signifie-t-il pas qu'un + ou un - peut être mis optionnellement au début ?
En faite c'est l'opérateur ? qui définit le caractère optionnel du modèle.
Plus précisément ? définit une redondance null ou unique du modèle.
Les chrochet permettre juste de regrouper plusieurs valeur possible pour un opérateur. Dans ce cas, soit un + ou un - moins ...

Sinon,

Code :
var reg = /^0\d(?:(?:-\d{2}){4}|(?:\s\d{2}){4}|\d{8})$/;
permet aussi les espaces ou aucun séparateur

Pour le modèle USA
Code :
/^\d{3}(?:(?:-\d{3}){2}|(?:\s\d{3}){2}|\d{6})$/
Perso je garderais les deux règles séparément, car elle pourront toujours servir ailleurs ...
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 18h26   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
pour une suite de 5 paires de chiffres séparés pas . - ou espace

a toi de nous dire exactement ce que tu veux valider ...

si tu veux que le séparateur soit le même entre chaque paire
Code :
^(\d{2}([ .-]))(\d{2}\2){3}\d{2}$
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 19h27   #6
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Merci de me répondre, mais comme j'aimerais comprendre, j'ai un peu de mal avec la 2e, notamment avec
Citation:
(\d{2}\2){3}
Peux-tu expliquer ? Et d'autre part, dans la réponse de kimjoa, il y a des ?: et pas dans la tienne ; peux-tu expliquer, d'autant plus que j'ai du mal à comprendre leur rôle.
Sinon, ce que je voudrais, c'est une liste de 10 nombres, éventuellement précédés par un +, et éventuellement avec des séparateurs (tiret (-), espace ou rien) ; mais comme la place de ces séparateurs dépend des pays, on autorise les 2 formats :
01sep23sep45sep67sep89 ou 012sep345sep6789

Je corrige ce que je voudrais (et je n'y suis pas arrivé) ; pour accepter les indicatifs internationaux (mais pas forcément présents) et pour être compatible avec le format de tous pays, j'imagine le format suivant :
Citation:
+(optionnel)suite de 9 à 17 caractères (des chiffres ou tiret ou espace)
Explication du nombre entre 9 et 17 :
  • indicatif international ou pas : 0 à 2
  • séparateurs possibles : 0 à 5
  • numéro : 9 à 10
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 21h39   #7
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
SpaceFrog a du faire une erreur dans ça règle, je la comprends pas ...
Pour ce qui est des ?: ,ça permet à l'analyseur de ne pas retenir en mémoire le modèle mit en parenthèse. C'est pas forcement utile dans les testes, mais ça peux l'être quand il s'agit de de trouver des motifs particulier.

Citation:
Sinon, ce que je voudrais, c'est une liste de 10 nombres, éventuellement précédés par un +, et éventuellement avec des séparateurs (tiret (-), espace ou rien) ; mais comme la place de ces séparateurs dépend des pays, on autorise les 2 formats :
01sep23sep45sep67sep89 ou 012sep345sep6789
Pour le premier format, le zéro en début de chaîne est obligatoire?
A quoi sert le plus?
Sinon il n'y a pas beaucoup de modification à faire sur les deux dernières règles que je t'ai proposé....
ca pourrait donner ca en rajoutant juste le + optionnel en début de chaine

Code :
1
2
3
/^\+?0\d(?:(?:-\d{2}){4}|(?:\s\d{2}){4}|\d{8})$/;
et
/^\+?\d{3}(?:(?:-\d{3}){2}|(?:\s\d{3}){2}|\d{6})$/
C'est plus simple de faire plusieurs règles, quand le modèle se complique...
bye !
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 21h54   #8
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
Ok je vois le délire ....
Il te faudra autant de règles que de formats d'entré possible
Y'a une liste ici
Si tu comprends les 2 règle que je t'ai passé, tu devrais pouvoir t'en sortir.

Pour l'indicateur optionnelle, il faudra rajouter au début
Pour faire toutes les règles, le plus simple serait de les créer dynamiquement, à partir d'un tableau de String, basé sur le même schéma qu'on retrouve sur le wiki du lien. + 33 (0) C CC CC CC CC par exemple pour la France.
Il faudra une routine pour construire le début de la règle correspondant au code international, et une autre pour la compléter en fonction du nombre des groupes, et du nombre de chiffre par groupe.

bye
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 21h57   #9
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Merci pour ta réponse,
le +, je ne sais pas à quoi il sert, mais j'ai remarqué que les gens le mettent souvent dans les numéros de téléphone.
Pour ma gouverne, il sert à quoi le premier ?: (avant la suite des 3 possibilités) ?
Enfin, tu m'apportes une solution pour mes 2 premiers cas, mais en fait, je voudrais remplacer ça par un contrôle un peu plus large, qui serait compatible avec le format de la plupart des pays :
Citation:
Je corrige ce que je voudrais (et je n'y suis pas arrivé) ; pour accepter les indicatifs internationaux (mais pas forcément présents) et pour être compatible avec le format de tous pays, j'imagine le format suivant :

Citation:
+(optionnel)suite de 9 à 17 caractères (des chiffres ou tiret ou espace)
Explication du nombre entre 9 et 17 :
indicatif international ou pas : 0 à 2
séparateurs possibles : 0 à 5
numéro : 9 à 10
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 22h09   #10
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Nos réponses se sont croisées...
La liste que tu évoques, je viens de la regarder !
Juste une question par rapport à ça : Ca ne serait pas plutôt (0 pour le cas où il n'y a rien)
Enfin, je ne comprends pas ça :
Citation:
Pour ce qui est des ?: ,ça permet à l'analyseur de ne pas retenir en mémoire le modèle mit en parenthèse.
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 22h18   #11
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
Citation:
Ca ne serait pas plutôt
Code :
(\+\d{0,3})?
(0 pour le cas où il n'y a rien)
Si j'ai compris non car le ? permet déjà de rendre le modèle optionnel, et le + signifie le format d'entre international, donc si il y a un plus il y a forcement au moins 1 chiffre servant d'identifiant

Code :
Pour ce qui est des ?: ,ça permet à l'analyseur de ne pas retenir en mémoire le modèle mit en parenthèse.
C'est utile quand il s'agit non pas de tester une règle, mais de retrouver des motif en fonction de la règle. c'est le rôle des fonctions match et exec en js. les modèles (entre parenthèse ) préfixé de ?: ne seront pas mit en mémoire, et la recherche se fera plus rapidement
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 22h31   #12
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
Si j'ai compris non car le ? permet déjà de rendre le modèle optionnel
Tu as mieux compris que moi (le + n'existe que s'il y a un indicatif international visiblement), mais s'il y en a un, il est suivi d'au moins un chiffre donc je dirais plutôt :
...
Et sinon, selon ton explication pour les ?:, ça marcherait quand même s'il n'y en avait pas, si j'ai bien compris (tout en étant moins rapide) ?
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 22h41   #13
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
Citation:
je dirais plutôt :
Code :
(\+\d{2,3})?
non, par exemple l'identifiant des USA, est +1 , donc il peux y avoir au minimum 1 chiffre, et non deux, comme dans t'as règle.

Code :
Et sinon, selon ton explication pour les ?:, ça marcherait quand même s'il n'y en avait pas, si j'ai bien compris (tout en étant moins rapide) ?
Oui ca marchera, d'ailleur dans ce cas, ça n'a aucune utilité...

Je suis en train d’essayer de faire une fonction pour ton problème, je te la file dans la soiré .... j'ai rien à faire
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 22h57   #14
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
non, par exemple l'identifiant des USA, est +1 , donc il peux y avoir au minimum 1 chiffre, et non deux, comme dans t'as règle.
OK, moi, j'avais compris que les 2 chiffres dans les accolades s'appliquaient au + et à l'indicatif. S'ils ne s'appliquent qu'à l'indicatif, OK pour car, même si je doute que ces pays soient concernés par mon site, les indicatifs internationaux à 3 chiffres existent.
Citation:
Je suis en train d’essayer de faire une fonction pour ton problème, je te la file dans la soiré .... j'ai rien à faire
merci beaucoup d'avance.
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 23h22   #15
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
\2 est un backreference qui rappelle le second niveau de parenthèses
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2011, 23h30   #16
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
bon j'ai pas tout fait, mais ca pourrait donner un truc du genre

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
var isPhoneNumber = function(){//function encapsulant des variables locale
 
    //la règle séparant le code international du reste
    var int_spliter_reg = /(\+(\d{1,3}\s))?(.*)/;
    //la règle supprimant les paranthèse
    var par_rep_reg = /\(|\)/g;
    //la règle remplavcant les C en \d
    var par_c_reg = /C/g;
 
    //à completer, les règles téléphonique à convertir en expressions régulières
    //!!! supprimer les éspaces en trop, provenant du wiki
    var rules_phone = ["+1 (CCC) CCC-CCCC",  "+33 (0)C CC CC CC CC"];
 
    //les expressions régulières
    var rules_reg = [];
 
    for(var i = 0, l = rules_phone.length; i < l; i++){
        var int_spliter = rules_phone[i].match(int_spliter_reg);
        //construction de expression
        var rule = new RegExp("^(\\+" + int_spliter[2] + ")?" +
            int_spliter[3].replace(par_rep_reg, "").replace(par_c_reg, "\\d") + "$");
 
        //ajout au tableau des expressions
        rules_reg[i] = rule;
    }
 
    //fonction globale
    return function(test){
        for(var i = 0, l = rules_reg.length; i < l; i++){
            if(rules_reg[i].test(test))
                return true;
        }
        return false;
    }
}();
 
//test numéro  francais
alert(isPhoneNumber("02 43 82 52 84"));
//test numéro internalionanale francais
alert(isPhoneNumber("+33 02 43 82 52 84"));
//test numéro francais mal fomaté
alert(isPhoneNumber("0243825284"));
//test numéro internalionanale francais mal fomaté
alert(isPhoneNumber("+1 02 43 82 52 84"));
 
//test numéro  américain
alert(isPhoneNumber("123 456-7890"));
//test numéro internalionanale francais
alert(isPhoneNumber("+1 123 456-7890"));
//test numéro francais mal fomaté
alert(isPhoneNumber("123 4567890"));
//test numéro internalionanale francais mal formaté
alert(isPhoneNumber("+33 123 456-7890"));
Par contre, si tu connais le pays , faudrait refaire une fonction du même type, mais avec un dictionnaire (un objet en faite) , avec comme clé , le code du pays, et en valeur, l'expression.

Code :
\2 est un backreference qui rappelle le second niveau de parenthèses
Je connaissais pas ! et ça à l'aire puissant !
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 00h12   #17
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Même si je reste preneur de ce que tu dois faire, j'ai mis une regexp qui couvre tous les cas :
Code :
var re3 =/^(\+\d{1,3})?[-\s\d]{9,15}$/;
mais c'est vrai que comme ça, on va accepter un numéro de téléphone uniquement composé, par exemple, de tirets...
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 09h35   #18
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 930
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 930
Points : 4 744
Points : 4 744
visiblement pas simple de faire une fonction internationale, bon courage.

une Regular Expression Library
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 10h59   #19
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
si tu connais le pays
non, on ne le connait pas.
Citation:
bon j'ai pas tout fait, mais ca pourrait donner un truc du genre
Merci quand même ; je vais essayer de comprendre ton code et de le compléter. (Je cocherai "résolu quand ce sera au point ; si je ne m'en sors pas, je reviendrai ici).
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 10h27   #20
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 450
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 450
Points : 2 149
Points : 2 149
Sinon plus simple (edit : elle ressemble beaucoup à celle de SpaceFrog ) :

Ca dit que ça peut commencer par +, - ou un chiffre, que chaque chiffre ou groupement de chiffre peut être séparé par un tiret et qu'il ne peut pas y avoir plusieurs tirets consécutifs.

Ca ne dit pas la longueur des groupements de chiffre, la longueur totale de la chaîne ni le nombre total de chiffres.

Après tu peux faire des posts traitements pour connaître le nombre de chiffres, la longueur totale, ...

Sinon je rejoins kimjoa, vaut mieux faire plusieurs règles qu'une seule regex imbitable.

PS :
En tout cas je crois que tous les membres du forums ont posté ici.
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h18.


 
 
 
 
Partenaires

Hébergement Web