Estou trabalhando em um aplicativo de SMS e preciso converter o número de telefone do remetente de +11234567890 para 123-456-7890 para que possa ser comparado aos registros em um banco de dados MySQL .
Os números são armazenados no último formato para uso em outro lugar no site e eu prefiro não alterar esse formato, pois isso exigiria a modificação de muito código.
Como eu faria isso com o PHP?
Obrigado!
php
phone-number
NightMICU
fonte
fonte
Respostas:
fonte
sprintf
ou `printf``? Alguém, por favor, me explique. Estou trabalhando apenas com números de telefone dos EUA e não acho que executá-los por meio de uma função de saída usando substring seja o melhor método.Este é um formatador de telefone dos EUA que funciona em mais versões de números do que qualquer uma das respostas atuais.
E aqui está uma análise da regex:
Atualizado: 11 de março de 2015 para usar em
{0,7}
vez de{,7}
fonte
~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})(?:[ \D#\-]*(\d{3,6}))?.*~
.(\d{3}) // 3 digits
[\d]
// caractere que não é um dígito{,7}
atualização{0,7}
. Eu atualizei o código.Esta função formatará números de telefone internacionais (10+ dígitos), não internacionais (10 dígitos) ou da velha escola (7 dígitos). Qualquer número diferente de 10+, 10 ou 7 dígitos permanecerá sem formatação.
fonte
Supondo que seus números de telefone sempre tenham este formato exato, você pode usar este snippet:
fonte
Os números de telefone são difíceis. Para uma solução internacional mais robusta, eu recomendaria esta porta PHP bem mantida da biblioteca libphonenumber do Google .
Usando assim,
você obterá a seguinte saída:
Eu recomendo usar o
E164
formato para cheques duplicados. Você também pode verificar se o número é realmente um número de celular ou não (usandoPhoneNumberUtil::getNumberType()
), ou se é mesmo um número dos EUA (usandoPhoneNumberUtil::getRegionCodeForNumber()
).Como um bônus, a biblioteca pode lidar com praticamente qualquer entrada. Se você, por exemplo, escolher executar
1-800-JETBLUE
o código acima, obteráNeato.
Funciona tão bem para outros países além dos EUA. Basta usar outro código de país ISO no
parse()
argumento.fonte
number_formatted
coluna em meu banco de dados e inserir manualmente os números formatados. Ainda usolibphonenumber
localmente para gerar os números formatados, mas incluir uma biblioteca tão grande para meu pequeno projeto é um exagero.Esta é minha solução apenas para os EUA, com o código de área como um componente opcional, delimitador obrigatório para a extensão e comentários de regex:
E aqui está o script para testá-lo:
fonte
Esta é uma função simples para formatar números de telefone com 7 a 10 dígitos de uma maneira mais europeia (ou sueca?):
fonte
Não reinvente a roda! Importe esta biblioteca incrível:
https://github.com/giggsey/libphonenumber-for-php
É baseado na biblioteca do Google para análise, formatação e validação de números de telefone internacionais: https://github.com/google/libphonenumber
fonte
Vejo que isso é possível usando algum regex ou algumas chamadas de substr (assumindo que a entrada é sempre desse formato e não muda o comprimento etc.)
algo como
deve fazer isso.
fonte
É mais rápido do que RegEx.
fonte
Experimente algo como:
isso levaria um $ número de
8881112222
e converter para888-111-2222
. Espero que isto ajude.fonte
'.'
também deve ser atualizado'-'
ou removido. Ele foi incluído devido ao caso de uso específico enfrentado - com muito pouco esforço, você poderia convertê-lopreg_replace('/\d{3}/', '$0-', substr($number, 2))
e responder à pergunta diretamente.Outra opção - facilmente atualizado para receber um formato da configuração.
fonte
Tudo,
Eu acho que consertei. Trabalhando para arquivos de entrada atuais e tem as 2 funções a seguir para fazer isso!
function format_phone_number:
function validate_phone_number:
Observe que tenho isso em uma classe lib, portanto, a chamada "self :: validate_phone_number" da primeira função / método.
Observe a linha nº 32 da função "validate_phone_number" onde eu adicionei:
para obter o falso retorno necessário, se não for um número de telefone válido.
Ainda preciso testar isso com mais dados, mas trabalhando nos dados atuais, com o formato atual e estou usando o estilo '8' para este lote de dados específico.
Também comentei a lógica da "extensão", pois estava constantemente recebendo erros dela, visto que não tenho nenhuma dessas informações em meus dados.
fonte
isto leva 7, 10 e 11 dígitos, remove caracteres adicionais e adiciona travessões indo da direita para a esquerda através da string. mude o traço para um espaço ou ponto.
fonte
Sei que o OP está solicitando um formato 123-456-7890, mas, com base na resposta de John Dul , modifiquei-o para retornar o número de telefone no formato de parênteses, por exemplo, (123) 456-7890. Este só lida com números de 7 e 10 dígitos.
fonte
Aqui está minha opinião:
A
sscanf
função recebe como um segundo parâmetro uma string de formato informando como interpretar os caracteres da primeira string. Neste caso, significa 2 caracteres (%2c
), 3 caracteres, 3 caracteres, 4 caracteres.Normalmente, a
sscanf
função também incluiria variáveis para capturar os dados extraídos. Caso contrário, os dados são retornados em uma matriz que chamei$parts
.A
print
instrução produz a string interpolada.$part[0]
é ignorado.Usei uma função semelhante para formatar números de telefone australianos.
Observe que, da perspectiva de armazenamento do número de telefone:
fonte
Formatos de telefone do Reino Unido
Para o aplicativo que desenvolvi, descobri que as pessoas inseriram seus números de telefone "corretamente" de uma forma legível por humanos, mas inseriram vários caracteres aleatórios, como "-" / "+44" etc. O problema era que o aplicativo em nuvem que ele precisava conversar era bastante específico sobre o formato. Em vez de usar uma expressão regular (pode ser frustrante para o usuário), criei uma classe de objeto que processa o número inserido no formato correto antes de ser processada pelo módulo de persistência.
O formato da saída garante que qualquer software receptor interprete a saída como texto em vez de um inteiro (que então perderia imediatamente o zero à esquerda) e o formato é consistente com a British Telecoms diretrizes sobre a formatação de números - que também ajuda na memorização humana, dividindo um número longo em grupos pequenos e facilmente memorizáveis.
+441234567890 produz (01234) 567 890
02012345678 produz (020) 1234 5678
1923123456 produz (01923) 123 456
01923123456 produz (01923) 123 456 01923
olá, este é text123456 produz (01923) 123 456
A importância do segmento de troca do número - entre parênteses - é que no Reino Unido, e na maioria dos outros países, as chamadas entre números na mesma central podem ser feitas omitindo o segmento de troca. No entanto, isso não se aplica aos números de telefone das séries 07, 08 e 09.
Tenho certeza de que existem soluções mais eficientes, mas esta se mostrou extremamente confiável. Mais formatos podem ser facilmente acomodados adicionando à função teleNum no final.
O procedimento é invocado a partir do script de chamada, portanto
`
fonte
Isso é para telefones fixos no Reino Unido sem o código do país
Resultado:
fonte
Por favor, dê uma olhada na função baseada em substr que pode mudar formatos
fonte
Verifique o número do telefone
fonte