PHP регулярное выражение против взрыва () для номера телефона - PullRequest
1 голос
/ 25 октября 2011

Я возился с некоторыми регулярными выражениями и натолкнулся на небольшую ошибку с более сложной версией форматирования моего телефонного номера.

Вот с чем я работаю:

$ number1 = '+1 (123) 1234567'; $ number1 = '+966 (1) 1234567 x555';

Эти строки на самом деле выводятся из запроса MySQL, который я создал, и мне это нравится. Тем не менее, я делаю простую функцию php для автоматического форматирования номера абонента от 1234567 до 123-4567.

Меня не слишком беспокоит любое число, которое не начинается с +1. Поэтому я форматирую номера в США и Канаде.

Вот то, что я попытался, если было только 7 цифр, и если строка начинается с + 1

<?php

function format_phonenumbers($phone){
    if(empty($phone)){ return ''; }

    $exploded = explode(' ',$phone);

    $countrycode = $exploded[0];
    $areacode = $exploded[1];
    $number = $exploded[2];
    $ext = (!empty($exploded[3])?$exploded[3]:'');

    if($countrycode=='+1'){
        $strphone = strlen($number);
        if ($strphone == 7) { // auto-format US PHones

            $prefix = substr($number,0,3);
            $suffix = substr($number,-4);

        }
        $phone = $countrycode.' '.$areacode.' '.$prefix.'-'.$suffix.' '.$ext;

    }

    return $phone;
}



echo format_phonenumbers('+1 (714) 1234567'); // US domestic
echo '<br>';
echo format_phonenumbers('+966 (1) 1234567 x555'); // international

?>

Это форматирует то, что мне нужно, но мне любопытно, если кто-нибудь поверит, что я могу сделать это лучше. Как при использовании средства проверки регулярных выражений, которое находит что-либо после круглых скобок, но перед расширением, вместо использования функции explode ().

1 Ответ

0 голосов
/ 12 ноября 2011

Что-то вроде:

function format_phonenumbers($phone)
{
    return preg_replace_callback(
        '/([)]\s*)(\d{3,3}(\d+)/',
        function ($match) {
            return $match[1] . $match[2] . '-' . $match[3];
        },
        $phone
    );
}

Это должно работать, но требует PHP 5.3.0 или выше (если нет, вам придется использовать create_function).Его спорно, если это лучше, однако.

...