Ir para o conteúdo
sEnte

[Resolvido] expressão preg_match para verificar número telefone

Mensagens Recomendadas

sEnte    0
sEnte

Estou a fazer um formulário de contacto para o Nucleo de estudantes de minha faculdade, e consegui fazer este preg_match para verificar o número de telemovel.

preg_match('#^9[1236]{1}[0-9]{7}$#

Disseram-me que seria melhor adicionar também um número da rede fixa. e o meu problema está aqui. Os indicativos não são propriamente iguais visto que tanto o Porto como Lisboa os indicativos são diferentes. Como é que eu posso, usando preg_match verificar estes indicativos todos? 21, 22, 231, 232, 233, 234, 235, 236, 238, 239, 241, 242, 243, 244, 245, 249, 251, 252, 253, 254, 255, 256, 258, 259, 261, 262, 263, 265, 266, 268, 269, 271, 272, 273, 274, 275, 276, 277, 278, 279, 281, 282, 283, 284, 285, 286, 289, 291, 292, 295, 296

Para o 21 e 22 podia substituir no preg_match que tenho, agora para o 231 e seguintes já não dá para fazer do mesmo modo.

terei de fazer 2 preg_match um para o 21 e 22 e outro para os 231 e seguintes ou dá para meter tudo dentro do mesmo?

Editado por sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg
$pattern = '/
^                  # desde o principio
  (?:              # agrupa sem captura
     9 [1-36] [0-9]      # primeiros 3 digitos quando comecado por 9
   | 2 [12] [0-9]        # primeiros 3 digitos quando comecado por 21 ou 22
   | 2 [35] [1-689]      # primeiros 3 digitos quando comecado por 23 ou 25
   | 2 4 [1-59]          # primeiros 3 digitos quando comecado por 24
   | 2 6 [1-35689]       # primeiros 3 digitos quando comecado por 26
   | 2 7 [1-9]           # primeiros 3 digitos quando comecado por 27
   | 2 8 [1-69]          # primeiros 3 digitos quando comecado por 28
   | 2 9 [1256]          # primeiros 3 digitos quando comecado por 29
  )                # fim do grupo
  [0-9]{6}         # finalizado por quaisquer 6 digitos
$                  # ate ao fim
/x';               // x para PCRE_EXTENDED

echo preg_match($pattern, '23456789'), "\n";
echo preg_match($pattern, '123456789'), "\n";
echo preg_match($pattern, '234567890'), "\n";
echo preg_match($pattern, '345678901'), "\n";
echo preg_match($pattern, '2345678901'), "\n";

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
sEnte    0
sEnte

Obrigado mas há uma coisa que não percebo...

pegando neste exemplo

26[1-35689]

quer isto dizer que os dois primeiros números são 26 depois mostra os sequenciais entre 1 e 3 ou seja 1, 2 e 3 e depois verifica para 5, 6, 8, 9 porque não são sequenciais certo?

Assim nunca usei.

Editado por sEnte

"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Obrigado mas há uma coisa que não percebo...

pegando neste exemplo

26[1-35689]

quer isto dizer que os dois primeiros números são 26 depois mostra os sequenciais entre 1 e 3 ou seja 1, 2 e 3 e depois verifica para 5, 6, 8, 9 porque não são sequenciais certo?

Sim, tens tudo explicado no manual :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
sEnte    0
sEnte

Já agora posso fazer isto assim?

$pattern = '/
^                  # desde o principio
 (?:              # agrupa sem captura
    9 [1-36] [0-9]      # primeiros 3 digitos quando comecado por 9
  | 2 [12] [0-9]        # primeiros 3 digitos quando comecado por 21 ou 22
  | 2 [35] [1-689]      # primeiros 3 digitos quando comecado por 23 ou 25
  | 2 4 [1-59]          # primeiros 3 digitos quando comecado por 24
  | 2 6 [1-35689]       # primeiros 3 digitos quando comecado por 26
  | 2 7 [1-9]           # primeiros 3 digitos quando comecado por 27
  | 2 8 [1-69]          # primeiros 3 digitos quando comecado por 28
  | 2 9 [1256]          # primeiros 3 digitos quando comecado por 29
 )                # fim do grupo
 [0-9]{6}         # finalizado por quaisquer 6 digitos
$                  # ate ao fim
/x';               // x para PCRE_EXTENDED

if (!preg_match($pattern, $contact_phone)) {
	    $errors[] = "Phone number must be 9 numbers long.";
    }


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    96
pmg

Ha numeros de 9 digitos que nao "passam" no preg_match.

O que eu quero dizer é que sim, podes fazer como indicas ... mas corres o risco de dizer ao utilizador que o "Phone number must be 9 numbers long." quando o valor introduzido tem 9 digitos.

Se o utilizador nao gostar de mensagens incompativeis com os dados, a culpa nao é minha! :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
sEnte    0
sEnte

Quais? Por exemplo um 237 certo? Parece que sim.

ah lol esqueci-me de mudar a mensagem. o preg_match que tinha antes verificava o tamanho.

Opa quando se percebe do assunto, percebe-se e pronto.

Obrigado, sendo assim acho que está resolvido. Pode ser fechado :)


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
sEnte    0
sEnte

Ainda continuando com o mesmo preg_match....

Não sei se é possivel telefonar de um fixo para um VoIP, nunca usei mas suponhamos que não dá. Como é que faço para se os dois primeiros números forem 30[0-9]

terei de fazer algo fo tipo

if (preg_match($pattern, $contact_phone) == '30[0-9]')

não me parece estar correcto mas pronto.


"If It Ain't Broke, Break it and build something Cooler!" Unknown

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Daniel Duarte    0
Daniel Duarte

Tenho de admitir que não percebo muito de Expressões Regulares, ainda não arranjei maneira de dedicar algum tempo a aprender.

Mas neste momento estou a desenvolver um script onde tenho de detetar se existe um número de telefone no meio de um texto longo.

Se fosse possível gostava de detetar o máximo de casos possível para apresentar um número de telefone. Por exemplo: 911231212 ou 91 123 12 12 ou 223 123 123 ou 96 1234567. Mas se não for possível, detetar apenas o primeiro caso já é bom.

Há alguma maneira de pegar no expressão regular apresentada em cima:

$pattern = '/
^                  # desde o principio
 (?:              # agrupa sem captura
    9 [1-36] [0-9]      # primeiros 3 digitos quando comecado por 9
  | 2 [12] [0-9]        # primeiros 3 digitos quando comecado por 21 ou 22
  | 2 [35] [1-689]      # primeiros 3 digitos quando comecado por 23 ou 25
  | 2 4 [1-59]          # primeiros 3 digitos quando comecado por 24
  | 2 6 [1-35689]       # primeiros 3 digitos quando comecado por 26
  | 2 7 [1-9]           # primeiros 3 digitos quando comecado por 27
  | 2 8 [1-69]          # primeiros 3 digitos quando comecado por 28
  | 2 9 [1256]          # primeiros 3 digitos quando comecado por 29
 )                # fim do grupo
 [0-9]{6}         # finalizado por quaisquer 6 digitos
$                  # ate ao fim
/x';               // x para PCRE_EXTENDED

e fazer com que detete o número no meio de um texto longo? Por exemplo: "Olá eu sou o João. Podem-me ligar para o 912345678 estou sempre disponível."

Muito obrigado pela ajuda.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

Para começar, tens de remover a obrigatoriedade de fazer match da string do princípio ao fim. Ou seja, removes o ^ e o $.

Depois, tens que passar a capturar o match. Ou seja, removes o ?:.

Por último, podes adicionar uns \s* pelo meio para permitir espaços.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Daniel Duarte    0
Daniel Duarte

Só mais uma questão, a parte final da expressão é [0-9]{6} = seis números quaisquer de 0 a 9!

Se eu quiser acrescentar espaços no meio não posso fazer, por exemplo:

(

[0-9]{6}

| [0-9]{3} \s* [0-9]{3}

)

a minha intenção com isto era acrescentar um caso que permitisse "123 123" para além de "123123"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Daniel Duarte    0
Daniel Duarte

Acabei a fazer isto:

(
(
	 9[1-36]\s*[0-9]\s*
  |  2[12]\s*[0-9]\s*
  |  2[35]\s*[1-689]\s*
  |  24[1-59]\s*
  |  26[1-35689]\s*
  |  27[1-9]\s*
  |  28[1-69]\s*
  |  29[1256]
)
(
	[0-9]{6}
  |  [0-9]{3}\s*[0-9]{3}
  |  [0-9]{1}\s*[0-9]{5}
  |  [0-9]{2}\s*[0-9]{4}
  |  [0-9]{4}\s*[0-9]{2}
  |  [0-9]{5}\s*[0-9]{1}
  |  [0-9]{2}\s*[0-9]{2}\s*[0-9]{2}
)
)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.