Page 1 sur 1

Cherche simple librairie PHP pour parser les numéros de téléphones dans un texte

Posté : 13 oct. 2023, 23:04
par two3d
Je dois convertir des numéros de téléphones dans des textes, je tente de faire une regex mais en vain, les numéros sont pas correctement pris en compte :
\b([+(]?(?:[0-9][.() -]*){8,}[0-9])\b
- Je n'arrive pas à demander de ne pas convertir un numéro si celui-ci est dans une URL (http//site/dossier615454542/etc..)
- Je n'arrive pas non plus à dire de récupérer le "+" du début, si y en a un.
- J'ai enlevé le \b pour capter le "+" mais ça pose souci sur le fait qu'il valide les numéros dans les URL.

Existe-t-il une librairie simple, en quelques lignes à peine et qui prend en compte les formats de tous les pays ?

Re: Cherche simple librairie PHP pour parser les numéros de téléphones dans un texte

Posté : 20 oct. 2023, 12:46
par @rthur
Pour avancer efficacement, je te recommande de créer un texte exemple de test avec tous les cas de figure possibles : les cas que tu veux récupérer, et les cas potentiellement problématique qui pourrait être récupérer par erreur.
Et ensuite https://regex101.com/ pour tester en temps réel tes regex.

Spécifiquement pour ton problème, essaye peut être de remplacer le premier \b par (?:^|\W)

Re: Cherche simple librairie PHP pour parser les numéros de téléphones dans un texte

Posté : 20 oct. 2023, 13:27
par two3d
Spécifiquement pour ton problème, essaye peut être de remplacer le premier \b par (?:^|\W)
D'accord, "(?:^|\W)" qui voudrait dire ?

Re: Cherche simple librairie PHP pour parser les numéros de téléphones dans un texte

Posté : 22 oct. 2023, 17:46
par two3d
Pour ceux qui aimeraient avoir une solution, j'ai réalisé une fonction de remplacement :

$texte = "Ces exemples illustrent différents formats de numéros de téléphone
États-Unis et Canada : +1 123-456-7890
Royaume-Uni : +44 20 1234 5678
France : +33 1 23 45 67 89
Allemagne : +49 30 12345678
Australie : +61 2 1234 5678
Japon : +81 3 1234 5678
Inde : +91 12345 67890
Chine : +86 10 1234 5678
Brésil : +55 11 1234-5678
Russie : +7 495 123-45-67";

//recherche tous les numéros de téléphone avec ou sans espaces, tirets ou points
//afin d'être sûr de trouver des numéros de téléphone on commence avec un "+\d", d'une longueur de 8 à X caractères/chiffres et on termine la patterne avec un chiffre "\d".
$regex = '#\+\d[\d\-.\s]{8,}\d#';

//remplace chaque correspondance par un lien "href tel:" avec les chiffres collés pour ne pas avoir de problème avec un numéro incorrect, comme +33.-54.54--54 -.54..54 (et selon la RFC 3966, les espaces ne doivent pas être utilisés dans les numéros de téléphone)
$texte = preg_replace_callback($regex, function($match){
	
	$numero = $match[0];
	$numero_sans_espaces = preg_replace('#[^\d]#', '', $match[0]);
	return '<a href="tel:+' . $numero_sans_espaces . '">' . $numero . '</a>';
	
}, $texte);


echo '<pre>';
print_r($texte);
echo '</pre>';