119 votes

Formater des numéros de téléphone en PHP

Salutations,

Je travaille sur une application SMS et j'ai besoin de pouvoir convertir le numéro de téléphone de l'expéditeur de +11234567890 à 123-456-7890 afin qu'il puisse être comparé aux enregistrements d'une base de données MySQL. Les nombres sont stockés dans ce dernier format pour pouvoir être utilisés ailleurs sur le site et je préférerais ne pas changer ce format, car il faudrait modifier beaucoup de code.

Comment pourrais-je m'y prendre avec PHP?

Merci!

177voto

Xeoncross Points 13263

Il s’agit d’un formateur de téléphone américain qui fonctionne avec plus de versions de chiffres que n’importe laquelle des réponses actuelles.

 $numbers = explode("\n", '(111) 222-3333
((111) 222-3333
1112223333
111 222-3333
111-222-3333
(111)2223333
+11234567890
    1-8002353551
    123-456-7890   -Hello!
+1 - 1234567890 
');


foreach($numbers as $number)
{
    print preg_replace('~.*(\d{3})[^\d]{,7}(\d{3})[^\d]{,7}(\d{4}).*~', '($1) $2-$3', $number). "\n";
}
 

Et voici une ventilation de la regex:

 Cell: +1 999-(555 0001)

.*          zero or more of anything "Cell: +1 "
(\d{3})     three digits "999"
[^\d]{,7}   zero or up to 7 of something not a digit "-("
(\d{3})     three digits "555"
[^\d]{,7}   zero or up to 7 of something not a digit " "
(\d{4})     four digits "0001"
.*          zero or more of anything ")"
 

Mise à jour: 7 juillet 2014 pour utiliser {,7} au lieu de *

114voto

slier Points 1790
$data = '+11234567890';

if(  preg_match( '/^\+\d(\d{3})(\d{3})(\d{4})$/', $data,  $matches ) )
{
    $result = $matches[1] . '-' .$matches[2] . '-' . $matches[3];
    return $result;
}

67voto

Bryan Schoen Points 111

Cette fonction permet de formater des numéros de téléphone internationaux (10 chiffres ou plus), non internationaux (10 chiffres) ou anciens (7 chiffres). Tous les nombres autres que 10+, 10 ou 7 chiffres resteront non formatés.

 function formatPhoneNumber($phoneNumber) {
    $phoneNumber = preg_replace('/[^0-9]/','',$phoneNumber);

    if(strlen($phoneNumber) > 10) {
        $countryCode = substr($phoneNumber, 0, strlen($phoneNumber)-10);
        $areaCode = substr($phoneNumber, -10, 3);
        $nextThree = substr($phoneNumber, -7, 3);
        $lastFour = substr($phoneNumber, -4, 4);

        $phoneNumber = '+'.$countryCode.' ('.$areaCode.') '.$nextThree.'-'.$lastFour;
    }
    else if(strlen($phoneNumber) == 10) {
        $areaCode = substr($phoneNumber, 0, 3);
        $nextThree = substr($phoneNumber, 3, 3);
        $lastFour = substr($phoneNumber, 6, 4);

        $phoneNumber = '('.$areaCode.') '.$nextThree.'-'.$lastFour;
    }
    else if(strlen($phoneNumber) == 7) {
        $nextThree = substr($phoneNumber, 0, 3);
        $lastFour = substr($phoneNumber, 3, 4);

        $phoneNumber = $nextThree.'-'.$lastFour;
    }

    return $phoneNumber;
}
 

35voto

Daniel Hepper Points 4992

En supposant que vos numéros de téléphone aient toujours ce format exact, vous pouvez utiliser cet extrait:

 $from = "+11234567890";
$to = sprintf("%s-%s-%s",
              substr($from, 2, 3),
              substr($from, 5, 3),
              substr($from, 8));
 

10voto

skibulk Points 684

Voici ma solution réservée aux États-Unis, avec l'indicatif régional en tant que composant facultatif, le délimiteur requis pour l'extension et les commentaires regex:

 function formatPhoneNumber($s) {
$rx = "/
    (1)?\D*     # optional country code
    (\d{3})?\D* # optional area code
    (\d{3})\D*  # first three
    (\d{4})     # last four
    (?:\D+|$)   # extension delimiter or EOL
    (\d*)       # optional extension
/x";
preg_match($rx, $s, $matches);
if(!isset($matches[0])) return false;

$country = $matches[1];
$area = $matches[2];
$three = $matches[3];
$four = $matches[4];
$ext = $matches[5];

$out = "$three-$four";
if(!empty($area)) $out = "$area-$out";
if(!empty($country)) $out = "+$country-$out";
if(!empty($ext)) $out .= "x$ext";

// check that no digits were truncated
// if (preg_replace('/\D/', '', $s) != preg_replace('/\D/', '', $out)) return false;
return $out;
}
 

Et voici le script pour le tester:

 $numbers = [
'3334444',
'2223334444',
'12223334444',
'12223334444x5555',
'333-4444',
'(222)333-4444',
'+1 222-333-4444',
'1-222-333-4444ext555',
'cell: (222) 333-4444',
'(222) 333-4444 (cell)',
];

foreach($numbers as $number) {
    print(formatPhoneNumber($number)."<br>\r\n");
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X