Данный метод заключается в том, чтобы отображать нужный формат номера телефона в зависимости от заданной маски.
Зададим массив с масками (пока только маска для украинских номеров телефона. Позже проверю ее и для российских форматов):
$formats = array( '12'=>'+############', // for +38 0XX XX XXX XX or 38 0XX XX XXX XX '10'=>'+38#########' // for 0XX XX XXX XX );
Ключ массива - это количество символов в строке, которая попадает на обработку по маске.
Дальше опишем функцию:
PhoneFormat($phone, $format, $mask = '#',$codeSplitter = '0')
{
$phone = preg_replace('/[^0-9]/', '', $phone);
$phone = substr($phone,strpos($phone,$codeSplitter));
if (is_array($format))
{
if (array_key_exists(strlen($phone), $format))
{
$format = $format[strlen($phone)];
} else
{
return $phone;
}
}
$pattern = '/' . str_repeat('([0-9])?', substr_count($format, $mask)) . '(.*)/';
$format = preg_replace_callback(
str_replace('#', $mask, '/([#])/'),
function () use (&$counter)
{
return '${' . (++$counter) . '}';
},
$format
);
return ($phone) ? trim(preg_replace($pattern, $format, $phone, 1)) : false;
}
Данная функция сначала очищает полученную строку с номером телефона от всех лишних символов (пробелы, дефисы, скобочки). Дальше мы отделяем код страны от кода оператора и самого номера (для Украины корректный формат будет +380XXXXXXXXX), но иногда пользователи забывают вбить один из символов: "+","3","8" - в любом сочетании, поэтому код страны отсекаем, а его добавляем дальше уже маской.
Дальше функция строит номер телефона в зависимости от прописанной маски.
Использование:
echo PhoneFormat('0987654321',$formats, '#');
echo PhoneFormat('+30987654321',$formats, '#');
echo PhoneFormat('+380987654321',$formats, '#');
echo PhoneFormat('30987654321',$formats, '#');
echo PhoneFormat('80987654321',$formats, '#');
echo PhoneFormat('+80987654321',$formats, '#');
// Все варианты вернут значение +38098765432
Теперь эту функцию можно использовать для вывода ссылки на совершение звонка:
<?$phone = '+3(098)765-43-21';?> <a href="tel:<?=PhoneFormat($phone)?>">$phone</a>
