← Desenvolvimento

PHP Dúvida em eregi

Lida 7646 vezes

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Boas!!
Tou a criar um novo código para um serviço que vou implementar no meu site, tá tudo pronto e a funcionar bem, mas como é do conhecimento geral de quem programa em php, restam sempre algumas arestas por limar...

No meu caso, quero que este exerto do código NÃO permita o caracter "." (ponto) ...

Código: [Seleccione]
if (file_exists($file) OR !eregi('^[A-Z_0-9][A-Z_0-9.-]*$', $name))
{
echo "Logged in";
}
else
{
echo "Not logged in !!";
}


ou seja, se a string $name for por exemplo $name="A.B"; fica echo "Not logged in"; //Inclui um ponto (.)

mas se for $name ="AB"; então echo "Logged in"; //Aceite, contem caracteres validos

Utilizo este eregi para impedir caracteres especiais como por exemplo '&' '$' '%', etc...

 :!: ...a solução NÃO é simplesmente retirar o "." aqui [A-Z_0-9.-]

Alguem tem alguma ideia de como deve ficar o eregi para este caso?
Desde já muito obrigado!  :wink:
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Tenta assim:

Código: [Seleccione]

$name = ".AB";

if (file_exists($file) OR preg_match('/^[a-zA-Z\_\-]+$/', $name))
{
echo "Logged in\n";
}
else
{
echo "Not logged in !!\n";
}


Acho que vai funcionar bem...
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Noop.
Não funciona Kingless, mesmo com um ponto na string $name continua a echo "Logged in";   :?
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Deve ser disso  "file_exists($file)" tu colocaste  "OR" em vez de  "&&"  tenta colocar assim:

Código: [Seleccione]

$name = ".AB";

if (file_exists($file) && preg_match('/^[a-zA-Z0-9\_\-]+$/', $name))
{
echo "Logged in\n";
}
else
{
echo "Not logged in !!\n";
}


Exemplo:
http://213.22.96.78/test.php?name=.AB
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Ups, foi um lapso meu, mas esqueci-me que a string $name já vem de trás obrigatóriamente com um ponto....
 :?
No meu caso era impossível funcionar porque

$name =  $_POST['check'];

Ou seja, $_POST['check'] é por exemplo 'MeuNome.DAT'

A coisa assim tá um pouco mais complicada porque tenho que arranjar maneira de o código permitir apenas um ponto, ou pemitir apenas .DAT

 :shock:

Sugestões??
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Ok, fez-se luz  :idea:  LoL

Fica assim:
Código: [Seleccione]
if (file_exists($file) OR !eregi('^[A-Z_0-9]+[.DAT]*$', $name))
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Estive a testar está tua forma e não funcionou, o teu codigo aceita todos caracteres... aceita $%&@#}_  e não aceita apenas .DAT.. aceita também $DAT ou .AB.

Acho que a minha forma funcionaria bem para o que queres fazer!!
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Aqui está a forma correcta para o que tu queres fazer:

Código: [Seleccione]

if (file_exists($file) OR eregi('^((\.)DAT*)?[a-z0-9_\-]+$', $name))
{
echo "Logged in\n";
}
else
{
echo "Not logged in !!\n";
}


Esta forma vai funcionar porque eu fiz muitos testes e é exectamente o que queres.
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Citação de: "kingless"
Estive a testar está tua forma e não funcionou, o teu codigo aceita todos caracteres... aceita $%&@#}_  e não aceita apenas .DAT.. aceita também $DAT ou .AB.

Acho que a minha forma funcionaria bem para o que queres fazer!!



Desculpa, mas estás enganado...
Já testei no meu PC e no próprio servidor e funciona exactamente como eu quero... Não aceita $DAT nem .AB. nem % nem &, etc, etc, etc...

Ora testa lá isso mais uma vez...

O que pode acontecer é que aceite por exemplo "myname.DAT" mas não aceita por exemplo "myname.my.DAT"

Não pernitir os "." é apenas por uma questão de estética, que em nada vai afectar o código que escrevi, como é obvio, não é apenas esta parte do código que põe um utilizador "Logged in", apenas usei como demonstração.

 :wink:

Acredito que a tua forma tambem funcione, mas a que escrevi tambem está a funcionar bem.
De qualquer maneira, obrigado pela ajuda e pelo teu tempo.
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

A tua forma não funciona bem, as expressões regulares não modificam de computador para computador...

http:// 213.22.96.78/test.php?name=$ABC%D.

Se quiseres confirmar o codigo do ficheiro:
http:// 213.22.96.78/test.php?source=test.php

Mas vamos já esquecer isso  :wink:
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

A minha forma funciona a 100% como já referi, como não reparaste, eu vou dizer-te porque é que funciona...

Por causa disto "!" antes do eregi...

em php "!" significa "not", ou seja, inverte totalmente a função de eregi no meu código. :wink:

Tambem houve uma falha da minha parte, é que o else seria echo " Logged in"; e não echo "Not Logged In.";
 :?
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Eu também coloquei "!" e eu sei que significa "not", mas como podes confirmar no meu link não está a funcionar.

Verifica outra vez: http://213.22.96.78/test.php?name=escreves_aqui

Eu só acho estranho como é que funciona no teu e no meu PC não, essas coisas pequenas podem nos ajudar muito se soubermos porquê que acontece isso.
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

É isso, fui eu que me enganei aqui na disposição dos echo quando expus a minha dúvida.

Decidi deixar o código final assim:

Código: [Seleccione]
if (file_exists($file) OR !eregi('^[A-Z_0-9]+[.DAT]*$', $name))
{
echo "Not logged in !!";
}
else
{
echo "Logged in";
}
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

aha, agora sim  :)  A unica coisa que não está bem é que também é possivel colocar A.A ou ABCD.AB em vez de só aceitar  ABCD.DAT
Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Citação de: "kingless"
aha, agora sim  :)  A unica coisa que não está bem é que também é possivel colocar A.A ou ABCD.AB em vez de só aceitar  ABCD.DAT


No meu código????
Olha k não!  Por ex ABC.DE NÃO é aceite pelo meu código