Tests Regex pour effacement numéro de tél

J’ai fait quelques tests sur https://dadastaging.okfn.fr/ de l’utilisation de Regex pour effacer les numéros de téléphone. Ca a marché une fois pour un numéro avec des espaces entre deux digits mais je l’ai effacé malencontreusement.

Comme je serai ammené à retester, je note ici quelques liens.

La doc d’alaveteli sur le sujet

https://alaveteli.org/docs/glossary/#regexp
https://alaveteli.org/docs/running/redaction/

Les Regex prêtes à l’emploi pour les numéros de téléphone français

https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/917386-les-expressions-regulieres-partie-2-2

https://openclassrooms.com/forum/sujet/regex-qui-accepte-les-numeros-de-telephone-33-et-de-01-a-57365

Je les ai testées dans https://rubular.com/, je ne comprends pas d’où vient le problème.

@LaurentS tu as une idée du problème ?

Pas sûr, mais si je devais deviner, je dirais que les regex ruby et JS ne sont pas compatibles (chaque language a des variantes, pourquoi faire simple quand on peut faire encore plus compliqué que des regex?).

PHP a 2 types de regex suivant la version de PHP que tu utilises, et aucune n’est compatible avec JS. Donc tes 2 liens ne sont déjà pas d’accord :frowning:
Bref, trouve des docs ruby :slight_smile:

J’essaie de regarder ça dans l’après-midi, mais je suis un peu charrette.

Hmmm j’ai testé dans https://rubular.com/, on dirait qu’elles fonctionnent par exemple celle là : ^(0|+33)[1-9]([-. ]?[0-9]{2}){4}$

Ok j’ai testé dans rubular, comme conseillé par la doc Alaveteli. Ton regexp ci-dessus semble correcte de tête @Sam mais rubular ne veut pas l’évaluer et mets l’avertissement :

Rubular suspects this regex will take forever to parse. Regexes of this sort make Rubular sad. Adjust the regex or else wait a few minutes and try again.

J’ai essayé avec la regexp moins gourmande suivante et qui semble couvrir tous nos cas :
(0|\+33)(( |\.)*[1-9])(( |\.)*[0-9]{2}){4}

Elle couvre les numéros de type :

  • +33 X XX XX XX XX
  • 0033 X XX XX XX XX
  • 0X XX XX XX XX
  • la même chose écrite avec des . au lieu des espaces
  • la même chose écrite sans espaces
  • peu importe que ce soit rien, ou les espaces ou les . qui soient utilisés comme séparateurs en mode mix (cela matche par exemple un numéro de type 06 74 982932, commencé avec des espaces, terminé sans)

Cette regexp ne reçoit pas d’avertissement de trop de temps d’évaluation. Son défaut est qu’elle matche les numéros de type 0.XXXXXXXXX (avec exactement 9 chiffres après le .). En France c’est pas le . qui est utilisé pour les nombres non entiers, donc je ne sais pas à quel point ce risque est réel (à moi il me paraît bien faible). En tout cas ce risque n’est pas différent de celui qui consiste à matcher de gros chiffres qui commencent par 0 et comportent au moins 10 nombres, exemple 0123456789 matche aussi, et cela peut des fois arriver ce type de chiffres (mais pareil, risque trop faible).

J’ai testé cette regexp sur les demandes suivantes :

Il reste maintenant à considérer dans notre regexp tous les préfixes des départements fr d’outre mer qui ne sont pas des +33(exemples ou ). Je peux faire ça demain et mettre en prod si vous êtes ok? Car je ne vois pas comment tester correctement sur staging …

Aussi si j’en crois la doc Alaveteli, la censure marche également sur la plupart des pièces jointes pdf, word … à tester aussi.

Merci beaucoup @eda ! Effectivement j’ai testé sur cette demande, ça marche bien (cf [tel]) : https://madada.fr/demande/compte_administratif_2019_2038#incoming-799

@LaurentS que dirais tu d’appliquer cette Regex à l’ensemble du site ?

PS : il y a un 06 dans cette demande

Ca serait super si j’arrivais devant la CADA avec la solution directement implémentée mais je veux pas casser le site

@eda il y’a un bug dans ta regex, qui capture aussi 0 8...34.23.... . ...34 98 (l’étoile match 0 ou plus espace ou point, mais en remplaçant par un ? (0 ou 1) ça passe encore.
J’ai un peu bricolé pour éviter de capturer les nombres décimaux style 0.123456789.

Du coup, ça donne ça:

(0[1-9]|((00|\+)(33|262|594)(( |\.)?[1-9])))(( |\.)?[0-9]{2}){4}

J’ai rajouté 2 indicatifs outre-mer, pour la frime :sunglasses:

Je reteste ça et je déploie sur la prod. Si c’est trop gourmand, on pourra ajuster, mais au moins on aura quelque chose à montrer à la CADA.

Coucou Laurent, je me suis posée la question pour le * au lieu du ? et je me suis dite que le fait de mettre plus d’espaces qu’un par erreur arrivait plus souvent que des numéros de tél interminables (i.e. à plus de 10 chiffres), mais ouais ça se discute :slight_smile:

Aller on casse tout alors :slight_smile: je suis dessus, je vais tester aussi dès que je vois que tu as déployé.

L’autre avantage du ? par rapport à l’étoile, c’est que tu as une limite sur la longueur max que le regex peut explorer. Avec l’étoile, tu peux en théorie évaluer une longueur infinie. Je cherche un peu la petite bête :bug:

Si on loupe des numéros, on peut toujours rajouter une règle spécifique sur la demande en question, avec le numéro codé en dur.

Oui oui tu as raison :slight_smile: vas-y on casse tout :slight_smile:

1 « J'aime »

@samgoeta j’ai mis en prod la regex pour les numéros de tel en global, donc toutes les demandes devraient être passées au peigne fin pour enlever ce qui ne doit pas y être. Si vous voyez des numéros qui sont passés à travers les mailles du filet, faites signe.

1 « J'aime »

Merci, j’ai vu la secrétaire général et la rapporteure qui semblait bien impressionnées qu’on l’ait mis en place en 24h

Regex numéro de tél, faux positif ici : https://madada.fr/demande/reference_dossier_402100049762_m

J’ai revu récemment la regex pour qu’elle prenne en compte les numéros séparés par des - (cas rencontré dans une réponse).

1 « J'aime »

Je viens de corriger la regex globale pour les numéros de tel. Dernière version:

(?<=\D)(0[1-9]|((00|\+)(33|262|594)(( |\.)?(\(0\))?[1-9])))(( |\.|\-)?[0-9]{2}){4}(?=\D)

En français:

  • (?<=\D) il ne doit pas y avoir de chiffre juste avant le numéro de tel
  • (0[1-9]|((00|\+)(33|262|594)(( |\.)?(\(0\))?[1-9]))) le préfixe, avec diverses combinaisons valides (00331, 00 33 (0), …)
  • (( |\.|\-)?[0-9]{2}){4} 4 groupes de 2 chiffres, séparés éventuellement par un espace, point ou tiret (ou rien)
  • (?=\D) il ne soit pas y avoir de chiffre juste après la fin du numéro

Cettte regex est un peu compliquée. Testez vos changements dans rubular.com sur les exemples ci-dessous avant de la changer: copiez le texte ci-dessous dans « Your test string ». Tous les numéros dans la première section doivent être capturés, mais rien dans la seconde section.

Numéros capturés:
+33 (0)1 44 87 74 10
0033651342368
+33 1 44 87 74 88
01 47 23 49 94
+33.6.51.34.23.68
01-54-23-98-00

Numéros NON capturés:
75010 (code postal)
20030033147200001 (un numéro français inclus dans un numéro plus long, donc pas du tout un tel)
003314720000145 (idem, mais le tel est au début du numéro)
402100049762 (un numéro quelconque)
0033147200001