Tudo que segue um padrão pode ser validado ou tratado por expressões regulares, inclusive os números de telefone.
is_tel é uma função que usa expressão regular para validar e separar números de telefone, levando em consideração o número, código de cidade/área e código de país. Retorna um array de índices country, city e number com seus valores caso a string de entrada seja validada pela expressão regular ou então retorna falso.
Exemplo:
if ($tel = is_tel('+55 11 1234-5678')) {
echo 'telefone válido';
print_r($tel);
}
array
(
[country] => 55,
[city] => 11,
[number] => 1234-5678
)
Com esta função você pode validar campos livres para telefone e depois até mesmo armazenar os dados separadamente.
Bateria de testes
# número
is_tel('1234-5678');
// true - array(number => 1234-5678)
# número de 7 dígitos
is_tel('123-4567');
// true - array(number => 123-4567)
# código de cidade, área
is_tel('11 12345678');
// true - array(city => 11, number => 1234-5678)
# código de país e cidade
is_tel('55 11 1234.5678');
true - array(country => 55, city => 11, number => 1234-5678)
# código de país e cidade com número de 7 dígitos
is_tel('55 11 123-4567');
true - array(country => 55, city => 11, number => 123-4567)
# códigos de país e cidade com mais de 2 dígitos
is_tel('1024 680 1234 5678');
true - array(country => 1024, city => 680, number => 1234-5678)
# outras formatações
is_tel('(+55) (11) 1234-5678');
true - array(country => 55, city => 11, number => 1234-5678)
is_tel('+55 (11) 1234 5678');
true - array(country => 55, city => 11, number => 1234-5678)
# separador diferente de hífen
is_tel('1234-5678', '.');
true - array(number => 1234.5678);
# sem separador
is_tel('1234-5678', '');
true - array(number => 12345678)
# inválidos
is_tel('abcd-1234');
false
is_tel('1234-567a');
false
Código fonte
/**
* Função para validar números de telefones.
* Retorna um array com código do país, código da cidade e número de telefone.
*
* @author Alejandro Fernandez Moraga <moraga86@gmail.com>
* @param string $str String de entrada
* @param string $glue String usada para unir os números do telefone
* @return array|false
*/
function is_tel($str, $glue='-') {
return preg_match('#^(?:(?:\(?\+?(?P<country>\d{2,4})\)?\s*)?\(?(?P<city>\d{2,3})\)?\s*)?(?P<n1>\d{3,4})[-\s.]?(?P<n2>\d{4})$#', $str, $matches) ?
array(
'country' => $matches['country'],
'city' => $matches['city'],
'number' => $matches['n1'] . $glue . $matches['n2']
)
: false;
}
Encontrando telefones em strings
Você pode usar a expressão regular da função para buscar números de telefones em strings.
#(?:(?:\(?\+?(?P<country>\d{2,4})\)?\s*)?\(?(?P<city>\d{2,3})\)?\s*)?(?P<n1>\d{3,4})[-\s.]?(?P<n2>\d{4})#
Só não se esqueça de remover que marcam ínicio e término da string, ^ e $.
preg_match_all(
'#(?:(?:\(?\+?(?P<country>\d{2,4})\)?\s*)?\(?(?P<city>\d{2,3})\)?\s*)?(?P<n1>\d{3,4})[-\s.]?(?P<n2>\d{4})#',
$string,
$matches
);