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

Avatar du membre
Mammouth du PHP | 1564 Messages

13 oct. 2023, 23:04

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 ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 oct. 2023, 12:46

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)
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

20 oct. 2023, 13:27

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

Avatar du membre
Mammouth du PHP | 1564 Messages

22 oct. 2023, 17:46

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>';