Programação, PHP, Javascript, HTML, CSS, Python
sexta, 3 de setembro

Validar números de telefones com expressão regular em PHP

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

Leave a Comment

Sobre o autor

Alejandro Moraga é um cientista da computação. Atualmente é o Webmaster da FAPESP. Já foi o desenvolvedor de sistemas ERP e CRM na Internetmídia. Moraga também desenvolve frameworks, ferramentas, sistemas e sites em nome da empresa METS no qual é sócio junto com sua esposa, e é um pesquisador da Inteligência Artificial.

Mais artigos

Guia de Expressões Regulares Compatíveis com Perl – PCRE
Guia de Expressões Regulares Compatíveis com Perl – PCRE

Guia PHP PCRE com funções, meta caracteres, modificadores do padrão, classes de caracteres base, quantificadores e [Leia mais]

Caçando e encontrando palavras com expressões regulares
Caçando e encontrando palavras com expressões regulares

As palavras são formadas por letras, que podem ser maiúsculas e minúsculas. Há palavras com acentuação e palavras [Leia mais]

Expressões Regulares – Padrões comuns
Expressões Regulares – Padrões comuns

Expressões regulares (ou regex, abreviação de regular expression) são uma forma compacta de especificar padrões de [Leia mais]