Page 1 sur 2

Vérification d'un nom entré en paramètre ?

Posté : 16 mai 2006, 09:11
par travisbarker
Bonjour !
je cherche à développer une classe "Personne" qui crée des personnes avec un nom et un prénom. Je voudrais effectuer des controles sur les chaines de caractères entrées par l'utilisateur.

Pour l'instant, j'ai le code suivant :

Code : Tout sélectionner

<?php class Personne { private $nom; private $prenom; public function __construct($nom, $prenom) { if ($this->verifieChaine($nom)) { $this->nom = $nom;} else{die('Le nom n est pas valide');} if ($this->verifieChaine($prenom)) { $this->prenom = $prenom;} else{die('Le prenom n est pas valide');} } public function __tostring() { return "Je suis $this->prenom $this->nom !"; } public function afficheToi() { print $this->__tostring(); } public function getNom() { return $this->nom; } public function getPrenom() { return $this->prenom; } private function contientDesCaracteresAdmis($chaine) { $ok = false; $caracteresAdmis = 'aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz'; for ($index = 1; $index <= strlen($chaine); $index++) { if (strcspn ($caracteresAdmis, $chaine{$index}) == strlen($caracteresAdmis)) { echo 'juste'; } else { echo 'faux'; } } return $ok; } private function commenceParMajuscule($chaine) { $ok = false; if ($chaine != null && strlen($chaine)>=1) { $ok = ($chaine{0} >= 'A' && $chaine{0} <= 'Z'); } return $ok; } private function verifieChaine($chaine) { $ok = false; if ($chaine != null) { $ok = $this->commenceParMajuscule($chaine); if ($ok && strlen($chaine)>=2) $ok = $this->contientDesCaracteresAdmis($chaine); } return $ok; } } ?>
La vérification de la chaine se fait en 3 étapes :
- Commence par une majuscule
- Contient des caractères admis
- Valide la chaine si les deux étapes précedentes fonctionnent

Or, avec le code que j'ai écrit, il n'y a que la vérification de la majuscule qui fonctionne.
Quand je vérifie les caractères admis, j'ai "fauxfauxfaux..." comme réponse.

Pour tester la classe Personne, j'utilise ce code :

Code : Tout sélectionner

<?php require_once('classes.php'); $personne = new Personne(Stehlin, Alex); $personne->afficheToi(); ?>
Quelqu'un voit où est le problème ?

Merci d'avance !

Posté : 16 mai 2006, 12:40
par jobherzt
deja, dans contientDesCaracteresAdmis($chaine) tu ne modifie pas la valeur de $ok..

et je pense que tu utilises incorrectement la fonction strcspn...

http://www.nexen.net/index.php?option=c ... rapide.php

Posté : 16 mai 2006, 12:48
par travisbarker
C'est vrai que j'ai oublié le $ok...

Par contre, pour la fonction strcspn, je ne vois pas trop ou est l'erreur...
strcspn ($caracteresAdmis, $chaine{$index}) -> Je cherche si le caractère à l'index de la chaine est dans ma liste des caractères admis...
En tout cas j'ai repris l'exemple du livre PHP 5 avancé.

EDIT:
J'ai changé la methode contientDesCaracteresAdmis:

Code : Tout sélectionner

private function contientDesCaracteresAdmis($chaine) { $ok = false; $caracteresAdmis = 'aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz'; for ($index = 1; $index <= strlen($chaine); $index++) { $ok = (strcspn ($caracteresAdmis, $chaine{$index}) == strlen($caracteresAdmis)); } return $ok; }

le soucis que j'ai maintenant : Je n'ai pas d'erreur quand je remplace un caractère du nom ou du prénom par un chiffre (par exemple)...

Posté : 16 mai 2006, 12:59
par jobherzt
je te cite la doc :
strcspn retourne la taille du premier segment de str1 qui ne contient aucun des caractères de str2 .
donc si $chaine{$index} contient un caractere qui n'est pas dans caracteresAdmis, la taille du premier segment de caracteresAdmis qui ne contient pas ce caractere va etre la taille de caracteresAdmis tout entier...

donc moi j'inverserais tes conditions, ca dire soit mettre une negation devant la condition, soit mettre faux en consequence du if, et vrai dans le else...

mais je pense que le mieux est d'utiliser strspn :
if(strspn($chaine, $caracteresAdmis) == strlen($chaine)) 
{
   return vrai;
}else{
   return faux;
}
en plus cela t'evite de faire une boucle...
dans l'absolu, je pense que ce genre de test est plus facile a realiser avec des expressions reguliere.

Posté : 16 mai 2006, 13:19
par travisbarker
mais je pense que le mieux est d'utiliser strspn :
if(strspn($chaine, $caracteresAdmis) == strlen($chaine)) 
{
   return vrai;
}else{
   return faux;
}
en plus cela t'evite de faire une boucle...
dans l'absolu, je pense que ce genre de test est plus facile a realiser avec des expressions reguliere.
J'ai modifié le code comme tu me l'a expliqué, mais même avec un nom valide, j'obtiens une erreur...

Et tu veux utiliser quoi comme expression régulière ?

Posté : 16 mai 2006, 13:44
par jobherzt
je verrais un truc du genre :
if(preg_match('#[^aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz]#',$chaine))
{
   return faux;
}else{
   return vrai;
}
ce qui signifie exactement "si tu trouves un caractere qui n'est pas dans aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz, retourne faux, sinon retourne vrai."

Posté : 16 mai 2006, 13:51
par travisbarker
je verrais un truc du genre :
if(preg_match('#[^aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz]#',$chaine))
{
   return faux;
}else{
   return vrai;
}
ce qui signifie exactement "si tu trouves un caractere qui n'est pas dans aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz, retourne faux, sinon retourne vrai."
J'ai essayé avec ta methode mais ça ne marche toujours pas... et je ne vois pas ou est l'erreur...

Mon code :
private function contientDesCaracteresAdmis($chaine) {
        if(preg_match('#[^aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz]#',$chaine)){
            $ok = false;
        } else {
            $ok = true;
        }
      return $ok;
    }

Posté : 16 mai 2006, 13:55
par jobherzt
moi non plus, je l'ai testée la :
http://www.lumadis.be/regex/test_regex.php

et ca a l'air de marcher... affiche ta variable chaine, pour voir ??

Posté : 16 mai 2006, 14:02
par travisbarker
moi non plus, je l'ai testée la :
http://www.lumadis.be/regex/test_regex.php

et ca a l'air de marcher... affiche ta variable chaine, pour voir ??
J'ai rajouté
echo $chaine;
après
private function contientDesCaracteresAdmis($chaine) {
et il m'affiche le contenu de $nom suivi de "Le nom n'est pas valide"...

Posté : 16 mai 2006, 14:20
par sadeq
Moi j'utiliserais l'expression régulaire preg_match comme ça:
<?php 

class Personne { 

      private $nom; 
      private $prenom; 

      public function __construct($nom, $prenom) { 
        if ($this->verifieChaine($nom)) { 
            $this->nom = $nom;} 
            else{die('Le nom n est pas valide');} 

        if ($this->verifieChaine($prenom)) { 
            $this->prenom = $prenom;} 
            else{die('Le prenom n est pas valide');} 
    } 

    public function __tostring() { 
        return "Je suis $this->prenom $this->nom !"; 
    } 

    public function afficheToi() { 
        print $this->__tostring(); 
    } 

    public function getNom() { 
        return $this->nom; 
    } 

    public function getPrenom() { 
        return $this->prenom; 
    } 

    private function contientDesCaracteresAdmis($chaine) { 
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 

    private function commenceParMajuscule($chaine) { 
            if ($chaine[0] && preg_match("#[A-Z]#", $chaine[0])) return true;  else return false;
    } 

    private function verifieChaine($chaine) { 
        if ($chaine && $this->commenceParMajuscule($chaine) && $this->contientDesCaracteresAdmis($chaine))
			return true; 
        else return false; 
    } 
} 

//Test
//personne valide
$personne_valide = new Personne("Stehlin", "Alex"); 
$personne_valide->afficheToi();

//Dans ce qui suit, déactiver un test pour tester le suivant (puisque l'erreur fait un Die)

//Nom non valide (maj manque au début)
$personne_non_valide1 = new Personne("stehlin", "Alex"); 
$personne_non_valide1->afficheToi();

//Prénom non valide (maj manque au début)
$personne_valide2 = new Personne("Stehlin", "alex"); 
$personne_valide2->afficheToi();

//Nom non valide (caractères non admis)
$personne_valide2 = new Personne("123", "Alex"); 
$personne_valide2->afficheToi();

//Prénom non valide (caractères non admis)
$personne_valide2 = new Personne("Stehlin", "123"); 
$personne_valide2->afficheToi();

?>
Remarque: pour plus d'infos sur preg_match : http://fr3.php.net/manual/fr/function.preg-match.php

Posté : 16 mai 2006, 14:41
par travisbarker
Moi j'utiliserais l'expression régulaire preg_match comme ça:
<?php 

class Personne { 

      private $nom; 
      private $prenom; 

      public function __construct($nom, $prenom) { 
        if ($this->verifieChaine($nom)) { 
            $this->nom = $nom;} 
            else{die('Le nom n est pas valide');} 

        if ($this->verifieChaine($prenom)) { 
            $this->prenom = $prenom;} 
            else{die('Le prenom n est pas valide');} 
    } 

    public function __tostring() { 
        return "Je suis $this->prenom $this->nom !"; 
    } 

    public function afficheToi() { 
        print $this->__tostring(); 
    } 

    public function getNom() { 
        return $this->nom; 
    } 

    public function getPrenom() { 
        return $this->prenom; 
    } 

    private function contientDesCaracteresAdmis($chaine) { 
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 

    private function commenceParMajuscule($chaine) { 
            if ($chaine[0] && preg_match("#[A-Z]#", $chaine[0])) return true;  else return false;
    } 

    private function verifieChaine($chaine) { 
        if ($chaine && $this->commenceParMajuscule($chaine) && $this->contientDesCaracteresAdmis($chaine))
			return true; 
        else return false; 
    } 
} 

//Test
//personne valide
$personne_valide = new Personne("Stehlin", "Alex"); 
$personne_valide->afficheToi();

//Dans ce qui suit, déactiver un test pour tester le suivant (puisque l'erreur fait un Die)

//Nom non valide (maj manque au début)
$personne_non_valide1 = new Personne("stehlin", "Alex"); 
$personne_non_valide1->afficheToi();

//Prénom non valide (maj manque au début)
$personne_valide2 = new Personne("Stehlin", "alex"); 
$personne_valide2->afficheToi();

//Nom non valide (caractères non admis)
$personne_valide2 = new Personne("123", "Alex"); 
$personne_valide2->afficheToi();

//Prénom non valide (caractères non admis)
$personne_valide2 = new Personne("Stehlin", "123"); 
$personne_valide2->afficheToi();

?>
Remarque: pour plus d'infos sur preg_match : http://fr3.php.net/manual/fr/function.preg-match.php
Cette methode marche nickel chez moi !
Merci !

Mais je vais quand même essayer de débeuguer la première version...

Posté : 16 mai 2006, 15:00
par travisbarker
Suite de mon problème... :oops:

J'ai créé un fichier PHP pour que l'utilisateur entre lui-même un nom et ça donne le code suivant :
<html>
<head>
 <title>Nom et prenom</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>

<form action="affiche_nom_et_prenom.php" method="POST">
<p>
Entrez un nom :</br>
<input name="nom" type="text"></br>
<input type="submit" value="Valider">
</p>
</form>

<?php

require_once('classes.php');

//Recupère le nom entré et l'assigne à la variable $nom
$_POST['nom'] = $nom;

//C'est $nom qui est testé
$personne_valide = new Personne($nom, "Alex");
$personne_valide->afficheToi();

?>

</body>
<html>
Et j'obtiens "le nom n'est pas valide"...

Posté : 16 mai 2006, 15:49
par jobherzt
désolé de jouer les rabats joie, mais
private function contientDesCaracteresAdmis($chaine) {
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 
ne fonctionnera pas comme tu veux... cette fonction renverra vrai des que la chaine contiendra au moins un caractere valide.. or toi tu veux qu'il n'y ai que des caracteres valides.. donc je pense qu'il faut utiliser la fonction que je t'ai proposée... si elle ne fonctionne pas, c'est qu'il doit y avoir un probleme sur la chaine..

Posté : 16 mai 2006, 16:10
par travisbarker
désolé de jouer les rabats joie, mais
private function contientDesCaracteresAdmis($chaine) {
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 
ne fonctionnera pas comme tu veux... cette fonction renverra vrai des que la chaine contiendra au moins un caractere valide.. or toi tu veux qu'il n'y ai que des caracteres valides.. donc je pense qu'il faut utiliser la fonction que je t'ai proposée... si elle ne fonctionne pas, c'est qu'il doit y avoir un probleme sur la chaine..
Non le problème, c'est que j'ai une erreur quand j'utilise la methose POST. Quand je rentre les nom et prénom directement dans le code PHP, je n'ai pas d'erreur.

Posté : 16 mai 2006, 16:30
par sadeq
désolé de jouer les rabats joie, mais
private function contientDesCaracteresAdmis($chaine) {
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 
ne fonctionnera pas comme tu veux... cette fonction renverra vrai des que la chaine contiendra au moins un caractere valide.. or toi tu veux qu'il n'y ai que des caracteres valides.. donc je pense qu'il faut utiliser la fonction que je t'ai proposée... si elle ne fonctionne pas, c'est qu'il doit y avoir un probleme sur la chaine..
Non le problème, c'est que j'ai une erreur quand j'utilise la methose POST. Quand je rentre les nom et prénom directement dans le code PHP, je n'ai pas d'erreur.
jobherzt a raison, l'expression preg_match ne répond pas exactement à la validation.
Mais la solution est d'utiliser preg_match_all pour forcer la validation de tous les caractères de la chaine (sans devoir utiliser une boucle)
    private function contientDesCaracteresAdmis($chaine) { 
 		//L'expression détecte au moins un caractère non valide
                 if (preg_match_all("#[^a-zäàâëèéêïîöôûù]#", strtolower($chaine), $résultat)) return false;
		else return true;      
    } 
Remarque : le strtolower() utilisé permet d'ignorer les majuscules

Pour ce qui est de ton formulaire il faut inverser l'affectation du $nom :
Corrigé:
$nom = $_POST["nom"];