Estou tentando reformatar (substituir, não validar - há muitas referências para validação) um número de telefone para exibição em Javascript. Aqui está um exemplo de alguns dos dados:
- 123 4567890
- (123) 456-7890
- (123)456-7890
- 123 456 7890
- 123.456.7890
- (em branco / nulo)
- 1234567890
Existe uma maneira fácil de usar uma expressão regular para fazer isso? Estou procurando a melhor maneira de fazer isso. Existe uma maneira melhor?
Quero reformatar o número para o seguinte: (123) 456-7890
javascript
regex
Matt K
fonte
fonte
Respostas:
Supondo que você deseja o formato "
(123) 456-7890
":function formatPhoneNumber(phoneNumberString) { var cleaned = ('' + phoneNumberString).replace(/\D/g, '') var match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/) if (match) { return '(' + match[1] + ') ' + match[2] + '-' + match[3] } return null }
Esta é uma versão que permite o
+1
código internacional opcional :function formatPhoneNumber(phoneNumberString) { var cleaned = ('' + phoneNumberString).replace(/\D/g, '') var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/) if (match) { var intlCode = (match[1] ? '+1 ' : '') return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('') } return null } formatPhoneNumber('+12345678900') // => "+1 (234) 567-8900" formatPhoneNumber('2345678900') // => "(234) 567-8900"
fonte
return (!m) ? null
parareturn (!m) ? ""
depois de adicionar esta função.'' + phoneNumberString
é o mesmo quephoneNumberString
... Já é uma string.formatPhoneNumber(8001231234)
Solução possível:
function normalize(phone) { //normalize string and remove all unnecessary characters phone = phone.replace(/[^\d]/g, ""); //check if number length equals to 10 if (phone.length == 10) { //reformat and return phone number return phone.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3"); } return null; } var phone = '(123)4567890'; phone = normalize(phone); //(123) 456-7890
fonte
var x = '301.474.4062'; x = x.replace(/\D+/g, '') .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3'); alert(x);
fonte
x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');
para funcionar para adicionar '+1' na frente do número de telefone, por exemploEsta resposta é emprestada da resposta da matemática. Ele difere principalmente porque aceita números de telefone parcialmente inseridos e formata as partes que foram inseridas.
phone = value.replace(/\D/g, ''); const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/); if (match) { phone = `${match[1]}${match[2] ? ' ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}`; } return phone
fonte
(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
newstring.length < oldstring.length
OU para rastrear a posição do cursor e descobrir quando o usuário acabou de retroceder sobre esses delimitadores, por exemploif (cursorPosition === 4 && numericString.length > 3)
Estou usando esta função para formatar números dos EUA.
function formatUsPhone(phone) { var phoneTest = new RegExp(/^((\+1)|1)? ?\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})( ?(ext\.? ?|x)(\d*))?$/); phone = phone.trim(); var results = phoneTest.exec(phone); if (results !== null && results.length > 8) { return "(" + results[3] + ") " + results[4] + "-" + results[5] + (typeof results[8] !== "undefined" ? " x" + results[8] : ""); } else { return phone; } }
Aceita quase todas as formas imagináveis de escrever um número de telefone nos Estados Unidos. O resultado é formatado em um formato padrão de (987) 654-3210 x123
fonte
pensando para trás
Pegue os últimos dígitos apenas (até 10), ignorando o primeiro "1".
function formatUSNumber(entry = '') { const match = entry .replace(/\D+/g, '').replace(/^1/, '') .match(/([^\d]*\d[^\d]*){1,10}$/)[0] const part1 = match.length > 2 ? `(${match.substring(0,3)})` : match const part2 = match.length > 3 ? ` ${match.substring(3, 6)}` : '' const part3 = match.length > 6 ? `-${match.substring(6, 10)}` : '' return `${part1}${part2}${part3}` }
exemplo de entrada / saída conforme você digita
formatUSNumber('+1333') // (333) formatUSNumber('333') // (333) formatUSNumber('333444') // (333) 444 formatUSNumber('3334445555') // (333) 444-5555
fonte
Eu tenho estendido a resposta de David Baucum para incluir suporte para extensões de até 4 dígitos de comprimento. Também inclui os parênteses solicitados na pergunta original. Essa formatação funcionará conforme você digita no campo.
phone = phone.replace(/\D/g, ''); const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})(\d{0,4})$/); if (match) { phone = `(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}${match[4] ? ' x' : ''}${match[4]}`; } return phone;
fonte
var numbers = "(123) 456-7890".replace(/[^\d]/g, ""); //This strips all characters that aren't digits if (numbers.length != 10) //wrong format //handle error var phone = "(" + numbers.substr(0, 3) + ") " + numbers.substr(3, 3) + "-" + numbers.substr(6); //Create format with substrings
fonte
Quase todos eles apresentam problemas quando o usuário tenta retroceder nos delimitadores, especialmente no meio da string.
Esta é uma solução jquery que lida com isso e também garante que o cursor fique no lugar certo enquanto você edita:
//format text input as phone number (nnn) nnn-nnnn $('.myPhoneField').on('input', function (e){ var $phoneField = e.target; var cursorPosition = $phoneField.selectionStart; var numericString = $phoneField.value.replace(/\D/g, '').substring(0, 10); // let user backspace over the '-' if (cursorPosition === 9 && numericString.length > 6) return; // let user backspace over the ') ' if (cursorPosition === 5 && numericString.length > 3) return; if (cursorPosition === 4 && numericString.length > 3) return; var match = numericString.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/); if (match) { var newVal = '(' + match[1]; newVal += match[2] ? ') ' + match[2] : ''; newVal += match[3] ? '-' + match[3] : ''; // to help us put the cursor back in the right place var delta = newVal.length - Math.min($phoneField.value.length, 14); $phoneField.value = newVal; $phoneField.selectionEnd = cursorPosition + delta; } else { $phoneField.value = ''; } })
fonte
Aqui está um que aceita números de telefone e números de telefone com ramais.
function phoneNumber(tel) { var toString = String(tel), phoneNumber = toString.replace(/[^0-9]/g, ""), countArrayStr = phoneNumber.split(""), numberVar = countArrayStr.length, closeStr = countArrayStr.join(""); if (numberVar == 10) { var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed. } else if (numberVar > 10) { var howMany = closeStr.length, subtract = (10 - howMany), phoneBeginning = closeStr.slice(0, subtract), phoneExtention = closeStr.slice(subtract), disX = "x", // Change the extension symbol here phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed. array = [phoneBeginningReplace, disX, phoneExtention], afterarray = array.splice(1, 0, " "), phone = array.join(""); } else { var phone = "invalid number US number"; } return phone; } phoneNumber("1234567891"); // Your phone number here
fonte
Você pode usar essas funções para verificar números de telefone válidos e normalizá-los:
let formatPhone = (dirtyNumber) => { return dirtyNumber.replace(/\D+/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3'); } let isPhone = (phone) => { //normalize string and remove all unnecessary characters phone = phone.replace(/\D+/g, ''); return phone.length == 10? true : false; }
fonte
As soluções acima são superiores, especialmente se estiver usando Java e encontrando mais números com mais de 10 dígitos, como prefixo de código internacional ou números de ramais adicionais. Esta solução é básica (sou um iniciante no mundo regex) e foi projetada com números de telefone dos EUA em mente e só é útil para strings com apenas 10 números com talvez alguns caracteres de formatação, ou talvez nenhum caractere de formatação (apenas 10 números ) Como tal, recomendo esta solução apenas para aplicações semi-automáticas. Pessoalmente, prefiro armazenar números como apenas 10 números sem formatar caracteres, mas também quero ser capaz de converter ou limpar números de telefone para o formato padrão que as pessoas normais e os aplicativos / telefones reconhecerão instantaneamente à vontade.
Encontrei este post procurando por algo que eu pudesse usar com um aplicativo de limpeza de texto que tenha recursos PCRE Regex (mas sem funções java). Vou postar isso aqui para pessoas que poderiam usar uma solução Regex pura e simples que poderia funcionar em uma variedade de editores de texto, limpadores, expansores ou mesmo alguns gerenciadores de área de transferência. Eu pessoalmente uso Sublime e TextSoap. Esta solução foi feita para Text Soap, uma vez que está na barra de menus e fornece um menu suspenso onde você pode acionar ações de manipulação de texto no que é selecionado pelo cursor ou no que está na área de transferência.
Minha abordagem consiste essencialmente em substituir / pesquisar e substituir regexes. Cada pesquisa de substituição e substituição envolve duas regexes, uma para pesquisa e outra para substituição.
Substituição / Pesquisa e Substituição # 1
Primeira substituição / pesquisa Regex:
\D
Primeira substituição / substituir Regex: "" (nada, nem mesmo um espaço)
Substituição / Pesquisa e Substituição # 2
$1
, um grupo de captura para o segundo conjunto de três números$2
e o último grupo de captura para o último conjunto de quatro números$3
. A regex para a parte substituta da operação insere a formatação de número de telefone dos EUA entre o grupo de dígitos capturados.Segunda Substituição / Pesquisa Regex:
(\d{3})(\d{3})(\d{4})
Segunda Substituição / Substituir Regex:
\($1\) $2\-$3
A barra invertida
(<-whitespace), e
\
escapa os caracteres especiais(
,)
,-
uma vez que estamos inserindo-os entre os nossos números capturados em grupos de captura$1
,$2
, e$3
para fins do número de telefone de formatação.No TextSoap, criei um limpador personalizado que inclui as duas ações da operação de substituição, portanto, na prática, parece idêntico à execução de um script. Tenho certeza de que essa solução poderia ser melhorada, mas espero que a complexidade aumente um pouco. Uma versão aprimorada desta solução é bem-vinda como uma experiência de aprendizado, se alguém quiser adicionar a isso.
fonte
Para números de telefone dos EUA
/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/
Vamos dividir essa expressão regular em fragmentos menores para torná-la fácil de entender.
/^\(?
: Significa que o número de telefone pode começar com um opcional(
.(\d{3})
: Após o opcional(
, deve haver 3 dígitos numéricos. Se o número de telefone não tiver um(
, ele deve começar com 3 dígitos. Por exemplo,(308
ou308
.\)?
: Significa que o número de telefone pode ter um opcional)
após os 3 primeiros dígitos.[- ]?
: Em seguida, o número de telefone pode ter um hífen opcional (-
) após)
se presente ou após os 3 primeiros dígitos.(\d{3})
: Então, deve haver mais 3 dígitos numéricos. Por exemplo(308)-135
ou308-135
ou308135
[- ]?
: Após o segundo conjunto de 3 dígitos, o número de telefone pode ter outro hífen opcional (-
). Por exemplo(308)-135-
ou308-135-
ou308135-
(\d{4})$/
: Finalmente, o número de telefone deve terminar com quatro dígitos. Por exemplo,(308)-135-7895
ou308-135-7895
ou308135-7895
ou3081357895
.Referência:
http://www.zparacha.com/phone_number_regex/
fonte