expressions régulières : contrôle du pseudo

Eléphant du PHP | 185 Messages

16 oct. 2009, 21:24

Bonjour à tous,

je suis actuellement en train de réaliser un formulaire d'inscription sur lequel j'aimerai effectuer un certains nombre de vérifications. Tout d'abord je m'attarderai sur le pseudo.

Voici le code pour le contrôler :
if (!preg_match('#^[\w-\.*]([ {1,1}]?[\w-\.*])*$#', $pseudo)) {
		$valid_form=false;
		$msg_erreur.='- Votre pseudonyme n\'est pas conforme<br />';
	}
Malheureusement avec ce code les pseudonymes ne peuvent pas contenir de caractères accentués.Or, si j'en crois ce que j'ai lu ailleurs :
\w : word metacharacter : une lettre [a-z] [A-Z] ou lettre accentuée, un chiffre [0-9] ou '_'.
Par conséquent les accents devraient être pris en compte comme caractères autorisés. Je ne comprend pas d'où peut venir le problème. Si jamais vous avez une idée...

Merci.

ViPHP
ViPHP | 4039 Messages

17 oct. 2009, 12:00

Je pense qu'il faut jouer avec l'encodage, de mémoire il me semble que les fonctions preg_* ne supportent que l'utf8.

Sinon, toujours en unicode, on peut s'amuser avec un range de ce type:

Code : Tout sélectionner

[a-z A-Z \u00c0-\u00FF]
et la tu es assez blindé, sauf pour ce qui est des caractères × et ÷, qui sont intercalés entre les lettres accentuées.


Codes unicode.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 185 Messages

17 oct. 2009, 14:04

C'est à priori la solution qu'il me fallait, sauf que le PCRE n'est pas autorisé sur mon serveur...

En attendant j'ai modifié la ligne de contrôle comme ceci :
if (!preg_match('#^[A-Za-z0-9\u00c0-\u00FF-.*]([ {1,1}]?[A-Za-z0-9\u00c0-\u00FF-.*])*$#', $pseudo)) {
Je vais voir si je peux changer les autorisations sur le serveur, sinon je me passerai des caractères accentués.

En tout cas merci beaucoup pour ton aide Berzemus.

[Edit]
Je ne comprend pas, après vérification, le PCRE est bien activé, donc ça devrait fonctionner.
PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 7.3 2007-08-28

Mammouth du PHP | 985 Messages

19 oct. 2009, 15:48

Je pense qu'il faut jouer avec l'encodage, de mémoire il me semble que les fonctions preg_* ne supportent que l'utf8.
Ah bon, depuis quand? #-o

Kaoteknik regarde ici (pour le déroulement):
php-debutant/expressions-regulieres-pre ... 50215.html

Et mon dernier post à ce sujet:
Bon en fait j'ai trouvé, cela n'a rien à voir avec l'encodage mais avec le setlocale().
A la différence près que pour l'UTF-8 faut aussi utiliser l'option \u

Avec l'encodage ISO:
<?php
header('Content-Type: text/html; charset=ISO-8859-1');
setlocale(LC_ALL,'fr_FR.ISO8859-1');
$chaine = 'abcé';
if (preg_match ('#^[[:alnum:]_-]{4,32}$#', $chaine)) {
    echo 'Preg_match: oui <br/>';
}
echo $chaine;
?>
Avec l'encodage UTF-8:
<?php
header('Content-Type: text/html; charset=UTF-8');
setlocale(LC_ALL,'fr_FR');
$chaine = 'abcé';
if (preg_match ('#^[[:alnum:]_-]{4,32}$#u', $chaine)) {
    echo 'Preg_match: oui <br/>';
}
echo $chaine;
?>
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.