Arcy Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Bonjour ! Je souhaite contrôler le nom et le prénom que l'utilisateur a saisi. Pour ça, j'ai fait une fonction : function ControleTexte($texte) { // la chaine ne doit pas contenir autre chose que des lettres, des espaces // ou des caractères d'accentuation $etat = true; $stop = false; $autorise = "" . "abcdefghijklmnopqrstuvwxyz" . "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "àâçèéêîôùûü" . "'-" . " "; if (!empty($texte)) { for ($i = 0; ($i < strlen($texte)) && ($etat == true); $i++) { for ($j = 0; ($j < strlen($autorise)) && ($etat == true); $j++) { // si il y a un caractère non-autorisé, on arrête if ($texte[$i] != $autorise[$j]) { $etat = false; } } } } return $etat;} Etant donné la construction des noms/prénoms (ils peuvent être composés, etc ...), un simple ctype_alpha() ne m'aide pas. J'ai donc pensé au REGEX mais j'y pige que dalle Si quelqu'un a une idée ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
chaps Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Hum... Ca ne peut pas marcher ton algo . En gros, si j'ai bien compris, pour chaque lettre de ton texte tu vérifies s'il y a une des lettres autorisées à laquelle elle n'est pas égale. Et vu que je ne vois pas comment une lettre pourrait être simultanément égale à toutes les lettres autorisées, du coup toutes les lettres du texte sont forcément rejetées. Je te laisse corriger toi même, ce n'est pas très compliqué. En fait il faut parcourir les lettres autorisées, et vérifier si au moins une correspond à la lettre du texte (et non pas toutes ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 10 février 2015 Auteur Partager Posté(e) le 10 février 2015 C'est con mais ça marchait pour autre chose xD Je modifie ça mais sinon, il y a rien de moins compliqué ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
chaps Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Je ne connais pas bien le PHP (je suppose que ça en est à la tête du code ), donc je ne sais pas ce qu'il est possible de faire niveau regexp. Mais si tu codes bien ton truc, en mettant les lettres les plus probables en début de tableau des caractères autorisés afin de sortir en moyenne plus vite, ça devrait être assez rapide. Sinon tu peux aussi mettre les caractères autorisés dans une map, ça te permettra d'avoir une recherche en temps logarithmique apriori plus efficace qu'un simple parcours de tableau . Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 10 février 2015 Auteur Partager Posté(e) le 10 février 2015 Oui, c'est du PHP. T'as quoi contre le PHP ? Sinon tu peux aussi mettre les caractères autorisés dans une map, ça te permettra d'avoir une recherche en temps logarithmique apriori plus efficace qu'un simple parcours de tableau Je vais voir pour ça, sinon mon algo semble fonctionner ... jusqu'à un point xD $texte = $_REQUEST["t"];$etat = true; $autorise = "" . "abcdefghijklmnopqrstuvwxyz" . "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "àâçèéêîôùûü" . "'-" . " "; if ($texte != "") { for ($i = 0; (($i < strlen($texte)) && ($etat == true)); $i++) { for ($j = 0; (($j < strlen($autorise)) && ($etat == true)); $j++) { echo $texte[$i]." ".$autorise[$j]."<br>"; if ($texte[$i] == $autorise[$j]) { $etat = false; echo "BOUH"; } } } } $texte vaut "BOB" (oui, je suis inspiré) B aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB vB wB xB yB zB AB BBOUH Lien vers le commentaire Partager sur d’autres sites More sharing options...
chaps Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Pourquoi tu considères que ce n'est pas bon quand tu trouves que ton caractère est dans la liste des caractères autorisés ? Tu devrais sortir de ta boucle concernant ce caractère car tu viens de le valider, et passer au suivant. Et non pas sortir tout cours . La condition de sortie en erreur, c'est quand tu as parcourus tous les caractères autorisés, et que le caractère de ton texte ne correspond à aucun d'eux ! Du coup une seule variable "etat" ne suffit pas, il te faut une variable "caractere_courant_ok" à mettre à vrai dès que tu trouves un caractère correspondant. Et tant que cette variable est fausse, tu continue de tester. Et si à la fin du parcours des caractères valides la variable est toujours fausse, et bah tu peux passer la variable etat à false. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 10 février 2015 Auteur Partager Posté(e) le 10 février 2015 Parce que ce que je veux faire, c'est quitter la boucle au premier caractère incorrect. Je trouve ça plus "simple" de m'arrêter quand je sais que la chaine est mauvaise plutôt que continuer. Après oui, on peut faire l'inverse : partir du fait que la chaine est pas bonne et rechercher tout les caractères autorisés. Mais étant donné que quelqu'un passera derrière moi pour maintenir l'application, j'avais pensé à un truc moins "dégueulasse", développement parlant D'où le fait que j'aie lorgner sur le Regex mais c'est du chinois pour moi Lien vers le commentaire Partager sur d’autres sites More sharing options...
chaps Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Je comprend bien, mais là ce que tu fais, c'est quitter la boucle au premier caractère correct . Ce que je te proposes, justement, c'est de quitter au premier caractère incorrect. Mais un caractère incorrect, justement, c'est un caractère que tu ne retrouve pas en parcourant tout le tableau des caractères autorisés Lien vers le commentaire Partager sur d’autres sites More sharing options...
ExIcarus Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Hey, Je sais pas quelle version de PHP tu utilises mais il y a des fonctions en php qui permettent deja de tester les chaines http://php.net/manual/fr/function.ctype-digit.php(si la chaine ne contient que des chiffres) http://php.net/manual/fr/function.ctype-alpha.php( la même mais pour les lettres) http://php.net/manual/fr/function.strstr.php(vérifier si une chaine contient bien un caractère ou non ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 10 février 2015 Auteur Partager Posté(e) le 10 février 2015 J'ai déjà tenté ctype-alpha() mais s'il y a un nom composé (genre "Bernard-Henri"), le trait d'union est pas considéré comme une lettre et ça foire. Je comprend bien, mais là ce que tu fais, c'est quitter la boucle au premier caractère correct . MAIS TU POUVAIS PAS LE DIRE AVANT ???? Bon sinon, j'ai apporté les modifs nécessaires. $etat = true;$autorise = "" . "abcdefghijklmnopqrstuvwxyz" . "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "àâçèéêîôùûü" . "'-" . " " . "_";for ($i = 0; (($i < strlen($texte)) && ($etat == true)); $i++) { $caracAutorise = false; for ($j = 0; (($j < strlen($autorise)) && ($caracAutorise == false)); $j++) { if ($texte[$i] == $autorise[$j]) { $caracAutorise = true; } // si on est arrivé au bout de la boucle, le caractère n'est pas autorisé else if ($autorise[$j] == "_") { $etat = false; } } } Ca, ça fonctionne. Même si c'est toujours dégueulasse Par contre truc bizarre, c'est que le caractère spéciale que j'utilise (Ł) n'est pas reconnu et fait que la boucle continue à tourner, alors qu'ailleurs ça semble fonctionner correctement. Le plus con, c'est que j'utilise ce genre d'astuces pour déterminer le type de message en retour (message d'erreur, de succès, le contenu qui arrive est un JSON, ...). 'fin bon, ça marche, mais je laisse quand même ouvert pour ceux qui auraient une autre solution. Pour le strstr(), je regarderai demain. Je crois que j'ai besoin de repos Lien vers le commentaire Partager sur d’autres sites More sharing options...
linconnu Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 $autorise = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','à','â','ç','è','é','ê','î','ô','ù','û','ü','-', ' '); for ($i = 0; $i < strlen($texte); $i++) { if (in_array($texte[$i], $autorise) == false) { echo 'BOUH'; break; } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mekarius Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Bonjour, Pour les regex tu peux faire la méthode suivante , ce qui est beaucoup plus simple : <?php // Regex qui verifie pour les lettres classiques (a-z), avec les accents suivants + le moins et les espace (\s) // Le ^, force la chaine à commencer directement par une de ces lettres // Le $, force à ce que la chaine termine par une de ces lettres $regex = "/^([a-z\\sàâçèëéêîôùûü-]+)$/si"; $string = "Jean-Michaël"; if(preg_match($regex,$string)){ echo "Ok"; } ?> Voilà pas vraiment l'habitude de poster donc j'espère que ça t'aidera Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kernelcoffee Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Bonjour, Pour les regex tu peux faire la méthode suivante , ce qui est beaucoup plus simple : <?php // Regex qui verifie pour les lettres classiques (a-z), avec les accents suivants + le moins et les espace (\s) // Le ^, force la chaine à commencer directement par une de ces lettres // Le $, force à ce que la chaine termine par une de ces lettres $regex = "/^([a-z\\sàâçèëéêîôùûü-]+)$/si"; $string = "Jean-Michaël"; if(preg_match($regex,$string)){ echo "Ok"; } ?> Voilà pas vraiment l'habitude de poster donc j'espère que ça t'aidera pas mieux. A la limite je mettrais un coup de trim pour nettoyer la chaine. Lien vers le commentaire Partager sur d’autres sites More sharing options...
chaps Posté(e) le 10 février 2015 Partager Posté(e) le 10 février 2015 Bon, je vois qu'il y en a qui maitrisent nettement mieux le langage que moi Mais au moins j'avais bon pour la partie algorithmique Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 10 février 2015 Auteur Partager Posté(e) le 10 février 2015 Bon, je vois qu'il y en a qui maitrisent nettement mieux le langage que moi Mais au moins j'avais bon pour la partie algorithmique GNA GNA GNA ! Je commente pas ce qui a été mis plus tôt, Chuis crevé et je vais au dodo Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 11 février 2015 Auteur Partager Posté(e) le 11 février 2015 Bonjour, Pour les regex tu peux faire la méthode suivante , ce qui est beaucoup plus simple : <?php // Regex qui verifie pour les lettres classiques (a-z), avec les accents suivants + le moins et les espace (\s) // Le ^, force la chaine à commencer directement par une de ces lettres // Le $, force à ce que la chaine termine par une de ces lettres $regex = "/^([a-z\\sàâçèëéêîôùûü-]+)$/si"; $string = "Jean-Michaël"; if(preg_match($regex,$string)){ echo "Ok"; } ?> Voilà pas vraiment l'habitude de poster donc j'espère que ça t'aidera Pour un premier message, c'est un bon début Sinon je conserve les autres pour plus tard. Pas forcément pour cette utilisation là mais c'est juste que ça pourrait m'aider (notamment le coup du tableau, je pense jamais à utiliser ses fonctions). Merci pour votre aide ; ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 11 février 2015 Auteur Partager Posté(e) le 11 février 2015 Je reviens ici pour faire un point : $autorise = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','à','â','ç','è','é','ê','î','ô','ù','û','ü','-', ' ');for ($i = 0; $i < strlen($texte); $i++){ if (in_array($texte[$i], $autorise) == false) { echo 'BOUH'; break; }} La solution consiste ici à utiliser in_array($valeur_à_trouver, $tableau), ce que j'ai fait pour une autre solution. J'utilise les paramètres URL pour connaitre ma position dans le site. J'ai 5 pages de premier niveau (Historique, A, B, C, D) et 2 pages situées sous Historique (Hist. A et Hist. B) $tableauTitre = array( "historique"=>"Historique", "a"=>"Page A", "b"=>"Page B", "c"=>"Page C", "d"=>"Page D", "ha"=>"Historique A", "hb"=>"Historique B");// on vérifie si $action existe en tant que clé dans le tableauif ((in_array($action, $tableauTitre)) == true) { // un tableau contient tout les titres de pages $titre = $tableauTitre[$action];}if ($action == "historique") { // si $choix a été défini if ((in_array($choix, $tableauTitre)) == true) { // un tableau contient tout les titres de pages $titre = $tableauTitre[$choix]; } else { // on prend le titre par défaut si aucun résultat $titre = $titreHistorique; }} Cette solution fonctionne pour $action, pas pour $choix : le tableau est bien parcouru mais aucun résultat. Je récupère donc le titre si je suis dans Historique, A, B, C et D mais rien quand je suis au second niveau. Solution : utiliser array_key_exists(), qui fait la même chose (pourquoi deux fonctions identiques ?). Résultat (avec $choix = hb): var_dump($choix);string 'hb' (length=2)var_dump(array_key_exists($choix, $tableauTitre));boolean truevar_dump(in_array($choix, $tableauTitre));boolean falsevar_dump($tableauTitre[$choix]);string 'Historique B' (length=12) Moralité : faites gaffe et ne passer pas, comme moi, 2 heures sur un truc de ce genre ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.