8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je dois tester qu'un champ de formulaire ne contient que des lettres et caractères accentués (français en l’occurrence) + les simples quotes.

Actuellement j'ai ceci dans ma fonction :

function isalpha($Chaine)
{
  //$Chaine = str_replace("'", "'", "$Chaine");
  setLocale(LC_CTYPE, 'FR_fr.UTF-8');
  $Chaine = iconv( "UTF-8", "ISO-8859-1//TRANSLIT//IGNORE", $Chaine) ;
  echo"<pre>$Chaine</pre>";
  return (ctype_alpha($Chaine) ) ? '1' : '0';
}


- Cette fonction marche bien pour les accents du type Jérôme.

- Par contre des mots avec des apostrophes comme M'hamed par exemple la fonction répond FALSE
- Des mots comme cœur affichent le message "Notice: iconv(): Detected an illegal character in input string "

Connaissez vous une méthode ? Faire un regex me semble bien lourd mais bon...

Merci pour vos informations.
Modifié par Bilgor Le Rouge (13 Jan 2012 - 10:11)
C'est normal, l'apostrophe existe en ISO 8859-1 donc elle reste dans la chaîne qui est passée à ctype. ctype_alpha n'autorise pas les apostrophes.

De plus ta fonction fait une translitération. Il est par exemple possible que le symbole epsilon devienne "E" sans que tu ne le vois.

Quel est ton objectif réel ? pourquoi souhaites tu limiter la saisie ? Ta méthode me semble mauvaise (et je te déconseille encore plus l'option regexp ou liste blanche). Pour te conseiller autre chose il faudrait voir dans quoi ça s'intègre fonctionnellement.

Et puis si je ne comprends pas ce que vient faire iconv. De mémoire si ta locale est bien mise, ctype_alpha devrait gérer directement l'UTF_8.
Déjà merci pour ta réponse,

a écrit :
C'est normal, l'apostrophe existe en ISO 8859-1 donc elle reste dans la chaîne qui est passée à ctype. ctype_alpha n'autorise pas les apostrophes.

Ok bien vu... Smiley sweatdrop

a écrit :
De plus ta fonction fait une translitération. Il est par exemple possible que le symbole epsilon devienne "E" sans que tu ne le vois.

Ok je n'en veux pas donc...

A vrai dire je ne maitrise pas trop, j'ai repris un exemple qui normalement fonctionnait mais que j'ai voulu tester...

Je veux tester des champs de formulaire :

- Que des lettres : un nom ou un prénom par exemple (quotes et accents donc pas de chiffre ni caractères bizarres)

- Mixte : un nom d'organisation, d'entité ou je ne sais quoi d'autre qui peut donc contenir des lettres chiffre caractères spéciaux => pas de test sauf la longueur du champ => ok
- Que des chiffres : un téléphone (sans l'international) => ok
- Mail : test d'une adresse mail => ok

Bref rien d'extraordinaire sur la validation de formulaire...

Merci pour vos infos et conseils.
Modifié par Bilgor Le Rouge (12 Jan 2012 - 14:17)
a écrit :
Faire un regex me semble bien lourd mais bon


Je n suis pas un spécialiste (loin de là), mais je ne vois pas bien en quoi une expression régulière serait plus lourde que ta fonction. Pour ma part j'utilise quelque chose comme cela pour controler à la fois les caractères et la longueur d'une chaine:

preg_match("/^[a-zA-Z àéèêëîùç\- \']{0,32}*$/", $chaine);
Oui effectivement je suis aussi passé par un regex finalement; et pour avoir tous les accents j'utilise avant un remplacement :

$Accents = array(
        'Š'=>'S', 'š'=>'s', '&#272;'=>'Dj', '&#273;'=>'dj', 'Ž'=>'Z', 'ž'=>'z', '&#268;'=>'C', '&#269;'=>'c', '&#262;'=>'C', '&#263;'=>'c',
        'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
        'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
        'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
        'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
        'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
        'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
        'ÿ'=>'y', '&#340;'=>'R', '&#341;'=>'r',);
$Chaine = strtr($Chaine, $Accents);
et j'ai rajouté l'espace, le tiret et la quote simple dans le regex :
$Regex  = '/^[-a-z \']+$/i';


S'il y a mieux faites moi signe Smiley cligne
Et si tu utilises \w (word caracter) à la place de a-z, ça donnes quoi ? Théoriquement ce motif supporte les caractères accentués. Par contre il autorise aussi les chiffres donc il ne faut pas oublier de les exclure.
Modifié par jb_gfx (13 Jan 2012 - 12:43)
il y a aussi une classe prédéfinie [[:alpha:]] signifiant n'importe quelle lettre (je ne l'ai jamais testée) mais si cela prend en compte les caractères accentués et n'est pas sensible la casse, ce serait assez élégant

preg_match("/^[-[:alpha:] \']+$/", $chaine);


Je suis preneur du résultat des tests Smiley cligne
Modifié par Merlin (15 Jan 2012 - 19:13)