Comment autoriser uniquement les caracteres alphanumeriques dans une chaine ?

WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 - 31 déc. 2007 à 21:07
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 6 janv. 2008 à 22:47
Salut !


Voilà, j'ai un petit probleme...

Je suis pas très très fort avec les syntaxes ereg...

Ce que je veux faire c'est interdire tout caractère qui n'est pas alphanumérique...

Caractères accentués compris.

En gros seulement abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789, rien d'autre...

Le tout, si c'est possible, sans faire une boucle qui passe en revue chaque caractere de ma chaîne...


J'avais donc fait :


    $regx = "[[:punct:]]|[[:blank:]]|[[:space:]]|[[:cntrl:]]";

    if(eregi($regx, $login))

    {

        // C'est pas bon change de login

    }


Le truc c'est que cette méthode interdit beaucoup de caractere mais
laisse passer plein d'autre caracteres que je ne veux pas. J'ai donc
pensé à faire l'inverse et n'autoriser que [a-z,A-Z,0-9] ... J'ai
essayé de plein de manière différentes mais bon j'arrive pas...


Une idée ?


merci d'avance

WizardNx qui va s'arracher une touffe de cheuveux.

11 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 janv. 2008 à 01:51
Hello,

ctype_alnum() sera plus efficace.
1
WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 1
2 janv. 2008 à 10:04
J'en ai parlé avec un ami...
En fait je pense maintenant que le probleme ne vient pas de PHP mais d'Ajax...
J'avais pas pensé à ajax au depart...
Au moment du passage de la variable le code interprete surement tout ce qui est après le & comme un deuxieme argument...

J'ai pas encore vérifié de ce coté là pour le moment...
1
WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 1
31 déc. 2007 à 21:58
C'est bon j'ai trouvé :

if(!preg_match('`^([[:alnum:]]+)$`', $login))
{
    // Pas bon
}

Faut que je rajoute juste un ptit truc car il me prend le caractere & mais c'est le seul apparement... Ca devrait pas être sorcier.

Par contre une bonne partie de mon cuir chevelu y est passé...
C'est vraiment mal foutu les regex !!

@ plouche
WizardNx.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
31 déc. 2007 à 22:02
Salut,

if (preg_match('`^([a-z0-9]+)$`i', $login)) {
// C'est ok
}
else {
// C'est pas ok
}

D'une manière générale, utilise plutôt preg_* que ereg : les PCRE sont toujours plus rapides que les regex standards, à motif équivalent.

Un ptit tuto sur les pcre : http://lumadis.be/regex/tuto_pcre.php
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
31 déc. 2007 à 22:04
Plutôt que la classe de caractères alnum, je te recommande de lister les caractères que tu veux. Avec l'option de recherche i, la PCRE est insensible à la casse.
Avec mon motif, il n'accepte que les lettres (majuscules et minuscules) et les chiffres.
0
WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 1
31 déc. 2007 à 22:58
oki :)

merci bien

@ plouche
0
WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 1
31 déc. 2007 à 23:02
J'ai un autre probleme là...

Byzarrement il accepte le &... mais pire, si je mets un &, derrière je peux rajouter n'importe quel caractère ca va passer.... :(
0
WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 1
1 janv. 2008 à 18:21
Salut et bonne année :)

Pour ctype_alnum() j'ai lu dansd la doc "En terme de langage
C
, les lettres
sont
[A-Za-z]
et cette fonction est équivalente à

preg_match('/^[a-z0-9]*$/i', $text)
."

J'ai quand même essayé et je me retrouve avec le même probleme, tout marche bien, mais le caractère & passe tranquil et après lui je peux rajouter n'importe quel caractère qui ne passerai pas normalement et ca passe...

Je comprends pas pour ce pµt@!|\| de &

@plouche
WizardNx.
0
WizardNx Messages postés 28 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 28 juin 2011 1
1 janv. 2008 à 19:38
Je vous ai mis le bout de code en ligne pour que vous puissiez tester, c'est plus parlant :

http://www.icreativ.com/regex/

faites des essais :

azerty => ca passe
aze,rty => ca passe pas
azerty& => ca passe alors que ca ne devrait pas
azerty&;,:,,:;, => ca passe aussi
azerty;,,:;,&:,:;,: => ca passe pas

On dirait que le caractère & fait s'arreter l'analyse de la chaine... que ce soit avec preg_match, ereg, eregi, ctype_alnum.....

:/

@ plouche
Nx.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
2 janv. 2008 à 09:23
Tu me pardonneras, mais moi :
<?php
echo (int)ctype_alnum('azerty&');
echo (int)ctype_alnum('azerty&;,:,,:;,');
?>
ça me renvoie 0 dans les 2 cas.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
6 janv. 2008 à 22:47
Salut,

Tu veux dire qu'il récure mal ? C'est peut-être un problème d'éponge aussi.

Plus sérieusement : Ajax ne PEUT pas poser de problème, puisqu'Ajax n'est pas une technologie, mais un ensemble de technologies dont Javascript et un objet XmlHTTPRequest (ou un activex avec IE).
0
Rejoignez-nous