Page 1 sur 1

preg_match_all sans les retour chariot

Posté : 25 févr. 2023, 01:55
par two3d
Je cherche à récupérer les numéros de téléphone dans un texte, le problème c'est qu'il me prend les retours à la ligne, je connais les regex (quoi que, pas assez) j'ai toujours eu du mal pour dire "accepte ceci et interdit cela" dans une même regex.
$msg = "
+0612345678
0512345785
";

preg_match_all("#\+?(?:[0-9]+(?:(?:\s|-){1,})?){8,}#", $msg, $match);
var_dump($match);

Code : Tout sélectionner

C:\wamp64\www\test.php:11: array (size=1) 0 => array (size=1) 0 => string '+0612345678 0512345785 ' (length=25)
EDIT : j'ai trouvé avec \B que j'ai rajouté (mais il m'enlève un numéro à la fin) :
preg_match_all("#\+?(?:[0-9]+\B(?:(?:\s|-){1,})?){8,}#", $msg, $match);

Code : Tout sélectionner

C:\wamp64\www\test.php:13: array (size=1) 0 => array (size=2) 0 => string '+061234567' (length=10) 1 => string '051234578' (length=9)

Re: preg_match_all sans les retour chariot

Posté : 25 févr. 2023, 14:51
par Saian
Coucou, le regex me paraît bien complexe par rapport à l'échantillon. Un simple pattern comme ça fait le job :
$pattern = "/\+?\d+/";

Avec un échantillon un peu plus varié :
/*
+0612345678
+33612345678
0512345785
06.12.34.56.78
06 12 34 56 78
+06.12.34.56.78
+336 12 34 56 78
*/
$pattern = "/\+?(\d{10,11}|[0-9\. ]{14,15})/";

Re: preg_match_all sans les retour chariot

Posté : 25 févr. 2023, 17:06
par two3d
Merci, j'avais omis la possibilité d'espacer avec des points ;)

La regex est complexe pour vérifier si les numéros sont espacés ou pas, avec ou sans tiret(s).
J'avoue que ma regex est un peu complexe, je comprends pas pourquoi la tienne ignore les sauts de lignes et la mienne continue.

/\+?\d+/ est trop simple et peut être passé sans souci pour celui qui connait la règle, je dois vraiment faire en sorte de récupérer tout numéro de téléphone potentiel dans le corps du message. +0612345678 et 0512345785 sont simples, pour l'exemple.

Personnellement je préfère utiliser [0-9], pour être sur qu'il accepte 0-9 (j'ai vu des forums qu'il acceptait aussi d'autre type de chiffres, en d'autres langues... a confirmer).

EDIT : je viens de comprendre, c'est mon \s qui accepte aussi les retours, une raison de + de pourquoi je préfère utiliser des choses compréhensibles, comme un espace " ", plutôt que "\s" (pareil que les "[0-9]" et les lettres ;)).

Merci encore !!

Voilà ma meilleure façon de récupérer ce qui s'apparente à des numéros de téléphones :
preg_match_all("#[+(]?(?:[0-9][.() -]*){8,10}[0-9]#", "+0612345678
+33612345678
+33 6 123 45    1    2    3.    4    5    6    7    8    9
+899552255
1234567890
123456789
12345678
1234567
(812) 602-0899
(812) (602)-0899
1-812-602-0899
05.12345678
0512345785
j'habite dans le 06.
mon departement     06123
j'ai gagné 215.215.215€ (est vu comme un numéro, faudrait mettre une vérification si le numéro est suivi d'une devise mais je sais pas faire) et 12345678 centimes
06.12.34.56.78
06 - 12 - 34    .  - 56 - 78
+06.12.34.56.78", $match);
var_dump($match);

Code : Tout sélectionner

C:\wamp64\www\test.php:22: array (size=1) 0 => array (size=15) 0 => string '+0612345678' (length=11) 1 => string '+33612345678' (length=12) 2 => string '+33 6 123 45 1 2 3' (length=27) 3 => string '+899552255' (length=10) 4 => string '1234567890' (length=10) 5 => string '123456789' (length=9) 6 => string '(812) 602-0899' (length=14) 7 => string '(812) (602)-0899' (length=16) 8 => string '1-812-602-0899' (length=14) 9 => string '05.12345678' (length=11) 10 => string '0512345785' (length=10) 11 => string '215.215.215' (length=11) 12 => string '06.12.34.56.78' (length=14) 13 => string '06 - 12 - 34 . - 56 - 78' (length=28) 14 => string '+06.12.34.56.78' (length=15)