IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Contrôler une chaines de caractères


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Contrôler une chaines de caractères
    bonjour,

    A ce jours j'ai une variable nommé : $grapes . cette variable étant tapé par un utilisateur, il se peu que des fois ce dernier commette des erreurs.
    Exemple de valeur que peut prendre $grapes :

    exemple 1 : 60% Négrette, (15%) Gamay
    exemple 2 : Négrette 60% - Gamay 15%,
    exemple 3 : Négrette 60%,Gamay 15%
    exemple 4 qui devrait être le bon : Négrette (60%), Gamay (15%).


    j'aimerai traité cette variable afin de lui rendre le même aspect : c'est à dire :
    cépage1 (chiffre1%), cepage2 (chiffre2%).

    Les actions que je doit faire :
    - remplacer les séparateur par des virgules
    - encadrer les % par des parenthèses si elle n'existe pas
    - rajouter un point en fin de chaîne
    - rajouter un espace après chaque virgule

    pensez vous que cela est faisable ? si oui comment ? je pense que preg_replace fera mon bonheur mais je suis un peu mauvais avec son utilisation.

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Salut,

    J'ai l'impression que tu devrais surtout proscrire la saisie libre de l'utilisateur pour un machin aussi compliqué.

    Pourquoi ne divises-tu pas en 4 items ?
    1) un select intitulé cépage 1
    2) un select intitulé %tage
    3) un select intitulé cépage 2
    4) un select intitulé %tage

    Et après, avec tes 4 sélections, tu construis ton format "Négrette (60%), Gamay (15%)"
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    oui, c'est une solution. mais pas viable dans mon cas (cela multiplierais beaucoup le nombre d'attribut)

    l'utilisateur se trompe rarement, je prend le cas extrême dans mon exemple ....

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Est ce que tes données finissent dans une base de données ? Si oui, j'insiste, 4 champs valent mieux qu'un. Si tu veux du propre, fais propre de la saisie à la persistence.
    Si non, tu fais ton contrôle préalablement côté saisie, en javascript, enfin en HTML5, les api javascript feront le reste. Et le PHP éliminera les petits malins qui ont désactivé leur js, sans les corriger.

    Pour ton pattern, tu en auras besoin côté client comme côté serveur, tu devras faire une expression régulière
    Négrette (60%), Gamay (15%) => un certain nombre de lettres, puis forcément un (, puis un ou deux chiffres, puis forcément un %), puis un espace et une virgule etc...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    j'ai encore plus simple

    Tu écris dans le formulaire :
    Merci d'indiquer sous cette forme : "cépage1 (...%), cépage2 (...%)"
    Cela dit, je Dendrite.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    la méthode simple est la meilleur, sauf que je crois que les utilisateurs ne comprennent pas ^^

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je me suis amusé hier soir...

    Exemples testés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $exemple[] = '60% Négrette, (15%) Gamay';
    $exemple[] = 'Gamay (75%)';
    $exemple[] = 'Gamay (15%), 60% Négrette';
    $exemple[] = 'Négrette 60% - Gamay 15%';
    $exemple[] = 'Négrette 60%,Gamay 15%';
    $exemple[] = 'Négrette (60%), Gamay (15%)';
    $exemple[] = 'Négrette (60%) - Gamay (15%)';
    $exemple[] = 'Négrette (60%), (15%) Gamay ,  autre vin (25%)';
    $exemple[] = 'Négrette (60%) , Gamay (15%), (35%) autre vin';
    $exemple[] = 'Négrette (60%)  ,(60%) Gamay (15%),  autre vin (27%)';
    $exemple[] = 'Negrette (60%), Gamay (15%),     autre vin (35%)';
    $exemple[] = 'Négrette (60%)  , Gamay (115%),     autre vin (12%)';
    $exemple[] = 'Cépage 1 (60%),   Cépage 2 (100%),  Cépage 3 (35%) ,     Cépage 4 (15%), Cépage 5 (7%)';
    ?>
    Solution 1 : contrôler la chaine complète
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    $pattern = '#^( *,? *([^\(\)%,-]+ \((100|[0-9]{1,2})%\)))+$#Ui';
    foreach($exemple as $i => $exs) // pour chaque exemple
    {
    	// on peut éventuellement supprimer les espaces en trop
    	$exs = preg_replace('#\s\s+#',' ', trim($exs)); // réduit les espaces multiples à un seul
    	$exs = preg_replace('#\s*,#',',', $exs); // enlève les espaces avant la virgule
     
    	// on vérifie la syntaxe de la chaine complète
    	if( preg_match( $pattern, trim($exs) ) )
    	{
    		// si ok, on affiche
    		echo $i.' : "'.$exs.'" = OK <br />'."\n";
    	}
    }
    ?>

    Solution 2 : contrôler chaque morceau de la chaine
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    $pattern = '#^([^\(\)%,-]+ \((100|[0-9]{1,2})%\))$#Ui';
    foreach($exemple as $i => $exs) // pour chaque exemple
    {
    	$ext = explode(',', $exs); // on sépare les morceaux
    	$ok	= true;
    	// on vérifie la syntaxe de chaque morceau
    	foreach($ext as $ex)
    	{
    		if( !preg_match($pattern, trim($ex)) ){ $ok = false; } 
    	}
    	// si tous les morceaux sont ok, on affiche
    	if($ok){ echo $i.' : '.$exs.' = OK <br />'."\n"; } 
    }
    ?>

    Ca semble donner les bons résultats dans les 2 cas :
    1 : "Gamay (75%)" = OK
    5 : "Négrette (60%), Gamay (15%)" = OK
    10 : "Negrette (60%), Gamay (15%), autre vin (35%)" = OK
    12 : "Cépage 1 (60%), Cépage 2 (100%), Cépage 3 (35%), Cépage 4 (15%), Cépage 5 (7%)" = OK
    N.B. Pour le pourcentage, j'ai limité à 100% maximum -> (100|[0-9]{1,2})%

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Efficace !
    Sinon tu fait quoi de t'es soirée ? j'en attendais pas autant ....

    je fait un test sur toute la base et te donne le résultat de ton opération dans la journée :p j'ai 1200 saisit, cela me permettra de voir rapidement l’efficacité !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Cadeau :
    -> On peut vérifier que la somme des pourcentages est inférieur à 100%
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    foreach($exemple as $i => $exs)
    {
    	// on supprime les espaces en trop
    	$exs = preg_replace('#\s\s+#',' ', trim($exs));
    	$exs = preg_replace('#\s,#',',', $exs);
    	// on vérifie la syntaxe
    	$pattern = '#^( *,? *([^\(\)%,-]+ \((100|[0-9]{1,2})%\)))+$#Ui';
    	if( preg_match( $pattern, trim($exs) ) )
    	{
    		echo $i.' : "'.$exs.'" = OK <br />'."\n";
    		// on vérifie que la somme des pourcentages est inférieur à 100%
    		$pattern2 = '#\((100|[0-9]{1,2})%\)#Ui';
    		if( preg_match_all( $pattern2, trim($exs), $matches ) )
    		{
    			if( array_sum($matches[1]) > 100 )
    			{
    				echo 'Attention : ('.implode('+',$matches[1]).')='.array_sum($matches[1]).'% supérieur à 100% !<br /><br />';
    			} else {
    				echo 'OK : ('.implode('+',$matches[1]).')='.array_sum($matches[1]).'%<br /><br />';
    			}
    		}
    	}
    }
    On obtient :
    1 : "Gamay (75%)" = OK
    OK : (75)=75%

    5 : "Négrette (60%), Gamay (15%)" = OK
    OK : (60+15)=75%

    10 : "Negrette (60%), Gamay (15%), autre vin (35%)" = OK
    Attention : (60+15+35)=110% supérieur à 100% !

    12 : "Cépage 1 (60%), Cépage 2 (100%), Cépage 3 (35%), Cépage 4 (15%), Cépage 5 (7%)" = OK
    Attention : (60+100+35+15+7)=217% supérieur à 100% !

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    bon après plusieurs jours d'utilisation.
    le bout de code fonctionne parfaitement.

    merci !

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    bon après quelques semaines d'utilisations,

    j'ai un cas qui ne fonctionne pas :

    exemple : 100 % Sauvignon

    en effet l'utilisateur à dans ce cas précis, inverser et mis le pourcentage avant le nom...

    cela me parait compliqué mais on ne sais jamais.

    il aurait aussi très bien pu écrire :
    50% merlot, 50 % Sauvignon

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dentrite t'avait donné la meilleure solution :
    Citation Envoyé par Dendrite Voir le message
    J'ai l'impression que tu devrais surtout proscrire la saisie libre de l'utilisateur pour un machin aussi compliqué.
    Plusieurs couples (input) "nom de cépage" - "pourcentage".

    Bien plus simple à gérer.

    N.B. Pour les "nom de cépage", on peut envisager une liste déroulante.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui je rejoins jreaux62 et Dendrite, c'est le côté saisie du formulaire qu'il faut retravailler. Evidemment ça demande un plus de travail mais au moins c'est évolutif et tu n'auras plus d'erreurs.

    Autant bien préparer le formulaire et partir sur de bonnes bases que la jouer trop facile au début pour avoir ensuite à gérer des catastrophes ou bizarreries. Surtout que tu peux aussi utiliser javascript pour un maximum de possibilités.

    Par exemple pour les cépages tu pourrais utiliser une liste déroulante comme dit jreaux62 mais pourquoi pas un autocomplète suivant les cas... Et suite à la sélection de ce champ déplacer automatiquement le focus dans le champ "pourcentage" pour faciliter la saisie.

    Bref l'utilisateur ne serait pas forcément handicapé et même avantagé si l'on considère l'utilisation des smartphones où l'on chercher plutôt à avoir une saisie minimum au clavier.

    L'important est de pouvoir gérer un couple d'input (cépages, pourcentage), on pourrait imaginer un ajout dynamique de ce couple de champs avec un bouton "plus" par exemple.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/07/2014, 16h20
  2. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo