Comment autoriser uniquement les caracteres alphanumeriques dans une chaine ?

Signaler
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
-
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
-
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

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Hello,

ctype_alnum() sera plus efficace.
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
1
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...
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
1
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.
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
19
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
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
19
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.
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
1
oki :)

merci bien

@ plouche
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
1
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.... :(
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
1
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.
Messages postés
28
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
28 juin 2011
1
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.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Tu me pardonneras, mais moi :
<?php
echo (int)ctype_alnum('azerty&');
echo (int)ctype_alnum('azerty&;,:,,:;,');
?>
ça me renvoie 0 dans les 2 cas.
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
19
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).