Aller au contenu

Vérifier si une chaine contient certains caractères


Arcy

Messages recommandés

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 :transpi:

 

Si quelqu'un a une idée ... :merci:

Lien vers le commentaire
Partager sur d’autres sites

Hum...

 

Ca ne peut pas marcher ton algo :transpi:. 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 :dd:)

Lien vers le commentaire
Partager sur d’autres sites

Je ne connais pas bien le PHP (je suppose que ça en est à la tête du code :dd:), 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 :chinois:.

Lien vers le commentaire
Partager sur d’autres sites

Oui, c'est du PHP. T'as quoi contre le PHP :baton: ? :transpi:

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 a
B b
B c
B d
B e
B f
B g
B h
B i
B j
B k
B l
B m
B n
B o
B p
B q
B r
B s
B t
B u
B v
B w
B x
B y
B z
B A
B B
BOUH

Lien vers le commentaire
Partager sur d’autres sites

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 :dd:. 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

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 :transpi:

 

D'où le fait que j'aie lorgner sur le Regex mais c'est du chinois pour moi :p

Lien vers le commentaire
Partager sur d’autres sites

Je comprend bien, mais là ce que tu fais, c'est quitter la boucle au premier caractère correct :dd:.

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

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

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 :dd:.

MAIS TU POUVAIS PAS LE DIRE AVANT ???? :transpi:

 

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 :transpi:

 

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 :dd:

Lien vers le commentaire
Partager sur d’autres sites


$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

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

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

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 :transpi:

 

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 ; )

 

:inpactitude:

Lien vers le commentaire
Partager sur d’autres sites

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 ... :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...