(?:(^\+\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\d{4,5})(\d{4})
-
(?:(^\+\d{2})?)
- Busca por um + seguido por dois números, opcional.
-
(?:([1-9]{2})|([0-9]{3})?)
- Busca por dois números de 1 à 9, ou três números de 0 à 9, isso faz a diferença entre o DDD com zero e DDD sem zero, lembrando que nenhum código de cidade tem o digito 0. Também opcional.
-
(\d{4,5})(\d{4})
- Segue buscando por dois grupos de números, um de 5 ou 4 digitos, que diferencia números de celular e telefones fixos (celulares tem o digito 9 a mais no começo), e os últimos números que são sempre 4 digitos segundo o padrão de números de telefones do Brasil.
function (str) {
return str
.replace(/\D/g, '')
.replace(/(?:(^\+\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\d{4,5})(\d{4})/,
(fullMatch, country, ddd, dddWithZero, prefixTel, suffixTel) => {
return fullMatch;
}
);
}
Com esse regex você conseguê a separação por código do país, código da cidade, prefixo e sufixo do telefone.
Capacidades numéricas:
-
1100000000
- [11][0000][0000]
- [ddd][prefixTel][Suffixtel]
-
11900000000
- [11][90000][0000]
- [ddd][prefixTel][Suffixtel]
-
00000000
- [0000][0000]
- [prefixTel][Suffixtel]
-
900000000
- [90000][0000]
- [prefixTel][Suffixtel]
-
01100000000
- [011][0000][0000]
- [dddWithZero][prefixTel][Suffixtel]
-
011900000000
- [011][90000][0000]
- [dddWithZero][prefixTel][Suffixtel]
-
+551100000000
- [+55][11][0000][0000]
- [country][ddd][prefixTel][Suffixtel]
-
+5511900000000
- [+55][11][90000][0000]
- [country][ddd][prefixTel][Suffixtel]
-
+5501100000000
- [+55][011][0000][0000]
- [country][dddWithZero][prefixTel][Suffixtel]
-
+55011900000000
- [+55][011][90000][0000]
- [country][dddWithZero][prefixTel][Suffixtel]
function formatPhone(str) {
return str
.replace(/\D/g, '')
.replace(/(?:(^\+\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\d{4,5})(\d{4})/,
(fullMatch, country, ddd, dddWithZero, prefixTel, suffixTel) => {
if (country) return `${ country } (${ ddd || dddWithZero }) ${ prefixTel }-${ suffixTel}`;
if (ddd || dddWithZero) return `(${ ddd || dddWithZero }) ${ prefixTel }-${ suffixTel}`;
if (prefixTel && suffixTel) return `${ prefixTel }-${ suffixTel }`;
return str;
};
);
}
Essa função irá retornar os números assim:
Input: 00000000
Output: 0000-0000
Input: 000000000
Output: 00000-0000
Input: 0000000000
Output: (00) 0000-0000
Input: 00000000000
Output: (00) 00000-0000
- Melhorar regex para remover caracteres não permitidos, a parte do código
.replace(/\D/g, '')
remove todos os caractéres que não são número[0-9]
. Permitir+
.
Opa! Tive que fazer um pequeno ajuste pra reconhecer ponto, traço ou qualquer caracter no meio do telefone.
ex.: 91234-5678, 91234.5678 ou ainda 91234 5678
Caso ajude, a regex ficou:
"(?:(^\\+\\d{2})?)(?:([1-9]{2})|([0-9]{3})?)(\\d{4,5}).?(\\d{4})"
:)