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

Langage PHP Discussion :

Compter le nombre de voyelles [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Compter le nombre de voyelles
    Bonjour,
    Le but de ce petit exercice est de compter le nombre de voyelles entrées dans un formulaire. Le problème est que je n'y arrive pas et je ne trouve pas mes erreurs.
    Tout d'abord j'ai cette erreur qui s'affiche quand je le lance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Undefined index: saisie in C:\Program Files\Wamp\www\Exo3\compte_nb_voyelle.php on line 4
    Et quand je clic sur le bouton sans rien mettre dans la case texte il me change m'a phrase alors qu'il devrait me dire que je n'ai rien saisi.
    Et il ne me compte pas le nombre de voyelle mais le nombre de lettre.
    Voici mon code si vous pouviez m'aider.
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <html>
    	<body>		
    		<?php
    		$compteur=0;
    		$saisie = $_POST['saisie'];
     
    		function compter($saisie)
    		{
    			for($i=0;$i < strlen($saisie);$i++)
    			{
    				if(@eregi("[aeiuoy]", $saisie))
    				{
    					$compteur++;
    				}
    			}
    			return $compteur;
    		}
    		if(!isset($saisie))
    		{
    			echo "Vous n'avez rien saisi";
    		}
    		else
    		{
    			echo "Il y a ".compter($saisie)." voyelle(s) dans $saisie";
    		}
    		?>
     
    		<form method='POST' action='compte_nb_voyelle.php'>
    		<input name='saisie' type='text' size='20'>
    		<input name='compter' type='submit' value='Compter'>
    		</form>
    	</body>
    </html>
    Merci d'avance.

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 248
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Undefined index: saisie in C:\Program Files\Wamp\www\Exo3\compte_nb_voyelle.php on line 4
    Cette erreur signifie que l'index "saisie" n'existe pas pour cette variable : $_POST['saisie'].

    Et c'est normal, car tant que le formulaire n'est pas soumis, la variable $_POST n'existe pas du tout !

    Il faudrait donc mettre quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ( isset( $_POST['compter'] ) )
    {
        $saisie = $_POST['saisie'] ;
    } 
    else
    {
        $saisie = '' ;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ( isset( $_POST['compter'] ) ) ? $saisie = $_POST['saisie'] : $saisie = '' ;

    Pour le décompte des voyelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function compter($saisie)
    {
            $tabSaisie = str_split( $saisie ) ;
        	$tabVoyelle = array ( 'a', 'e', 'i', 'u', 'o', 'y' ) ;
        	$compteur = 0 ;
        	foreach ( $tabSaisie as $letter )
        	{
        		if ( in_array ( $letter , $tabVoyelle ) )
        		{
        			$compteur++ ;
        		}
        	}
            return $compteur ;
    }
    Tu peux aussi mettre : $tabVoyelle = str_split( 'aeiouy' ) ;

    Par contre va peut-être falloir penser aux accents...
    Et je pense que tu devrais aussi sortir tes fonctions de ton flux, pour l'instant il n'y en a qu'une mais par la suite si tu en rajoute ça sera plus lisible !

  3. #3
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Bonjour,

    j'aurais plutot utiliser ceci pour les voyelles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(?:[aeiou]|(?<![aeiou])y)'
    et pour les consonne par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(?:[bcdfghjklmnpqrstvwxz]|(?<=[aeiou])y|^y)'

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par la_chouette Voir le message
    Bonjour,

    j'aurais plutot utiliser ceci pour les voyelles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(?:[aeiou]|(?<![aeiou])y)'
    et pour les consonne par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(?:[bcdfghjklmnpqrstvwxz]|(?<=[aeiou])y|^y)'
    a quoi elles servent tes références ?

  5. #5
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    C'est un masque regexp que l'on peut coupler avec une fonction calback sur un tableau ... pour compter ...

    J'utilise cela pour un projet (analyseur syntaxique) ...

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par la_chouette Voir le message
    C'est un masque regexp que l'on peut coupler avec une fonction calback sur un tableau ... pour compter ...

    J'utilise cela pour un projet (analyseur syntaxique) ...
    ta un exemple parce que je vois pas dutout

  7. #7
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Pourquoi pas faire plus simple ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $phrase = 'Un test avec des voyelles'; 
     
    preg_match_all('#([aeiouy])#i', $phrase, $matches);
     
    echo count($matches[1]);

  8. #8
    Membre très actif Avatar de la_chouette
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 183
    Par défaut
    Oui Madfrix, les masques était juste à titre d'exemple ...

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 248
    Par défaut
    J'ai une question sur vos propositions...

    Il me semblait que les expressions régulières étaient plutôt lentes à traiter. Est-ce justifié ici dans la mesure où l'on peut faire autrement ?

  10. #10
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par albedo0 Voir le message
    J'ai une question sur vos propositions...

    Il me semblait que les expressions régulières étaient plutôt lentes à traiter. Est-ce justifié ici dans la mesure où l'on peut faire autrement ?
    Dans ce genre de cas un expression régulière bien utilisée (comme Madfrix le propose) est nettement plus rapide.
    Sur une chaine de 2700 caractères dont 969 voyelles :

    Preg_match_all = 0.82ms
    Boucle avec in_array = 2.75ms
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Attention à ne pas confondre temps unitaire d'instruction et temps total d'exécution du script. Bien sur, une regex est lente mais j'effectue beaucoup moins d'instructions que le script proposé (appel de plusieurs fonctions + boucle). Le in_array à mon avis est gros consommateur de temps et de ressources d'autant plus que le tableau en param est gros.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Merci à tous pour vos explications mais j'ai fini par trouver autrement.
    Pour l'instant je débute donc c'est un peu compliqué pour moi d'utiliser les expressions régulières !
    Voici le résultat:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <html>
    	<body>		
    		<?php
    		//Si saisie existe
    		if (isset($_POST['saisie']))
    		{	
    			//On affecte la valeur entrée dans le champs à une variable
    			$saisie = $_POST['saisie'];
     
    			//Puis on execute la fonction compter
    			function compter($saisie)
    			{
    				//On affecte le compteur à 0 pour commencer
    				$compteur=0;
    				//Puis on découpe la chaine de caractère en forme de tableau où chaque caractère correspond à une case
    				for($i=0;$i < strlen($saisie);$i++)
    				{
    					//On parcours le tableau et si une voyelle est trouvé
    					if(@eregi("[aeiuoy]", $saisie[$i]))
    					{
    						//On incrémente le compteur de 1
    						$compteur++;
    					}
    				}
    				//On retourne la valeur de compteur
    				return $compteur;
    			}
    			//Si notre variable existe mais qu'elle est vide
    			if(isset($saisie) and empty($saisie))
    			{
    				//On affiche
    				echo "Vous n'avez rien saisi";
    			}
    			else
    			{	//Sinon on affiche
    				echo "Il y a ".compter($saisie)." voyelle(s) dans $saisie";
    			}
    		}
    		?>
     
    		<form method='POST' action='compte_nb_voyelle.php'>
    		<input name='saisie' type='text' size='20'>
    		<input name='compter' type='submit' value='Compter'>
    		</form>
    	</body>
    </html>
    Pour retirer l'erreur d'index j'ai créer une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['saisie']))
    Ensuite erreur toute bête de ma part je n'avais pas mis le [$i] ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(@eregi("[aeiuoy]", $saisie[$i]))
    Voilà globalement mes erreurs !

    Maintenant ça tourne, problème résolu, merci à tous pour votre aide.

  13. #13
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    tu ne devrais plus utiliser eregi et idem avec le @

    C'est un peu compliqué pour toi d'utiliser les expressions régulières mais tu les utilises quand même

  14. #14
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Par défaut
    Salut,

    Pourquoi ne pas utiliser preg_replace() afin d'obtenir une chaine ne contenant que les voyelles et retourner ensuite sa longueur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    function compter($saisie){
    	$s=preg_replace('/[^aeiou]/i','',$saisie);
    	return strlen($s);
    }
    ?>

  15. #15
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pour l'instant je débute donc c'est un peu compliqué pour moi d'utiliser les expressions régulières !
    Mais tu le fais quand même et d'une manière absolument pas adapté :
    - Dans une boucle
    - Avec des fonctions dépréciées (ereg)
    - En ajoutant un @ sans doute pour cacher le message de dépréciation , ce qui ralentit l'execution

    LA solution de Madfrix avec preg_match_all est largement plus simple et rapide !
    Citation Envoyé par Eric2a Voir le message
    Salut,

    Pourquoi ne pas utiliser preg_replace() afin d'obtenir une chaine ne contenant que les voyelles et retourner ensuite sa longueur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    function compter($saisie){
    	$s=preg_replace('/[^aeiou]/i','',$saisie);
    	return strlen($s);
    }
    ?>
    Parce que preg_match_all , renvoi un tableau avec toutes les occurrence qu'il suffit de compter mais aussi et surtout qu'un preg_replace doit certainement être plus long qu'un preg_match
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Moi qui croyais que ma solution serait adoptée tout de suite et sans débat

  17. #17
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Par défaut


    Je n'ai pas mentionner que ta solution est de loin supérieure au couple foreach/eregi tellement c'est évident.

    Mais je me suis dit que preg_replace() serait peut-être plus rapide.

  18. #18
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par Eric2a Voir le message


    Je n'ai pas mentionner que ta solution est de loin supérieure au couple foreach/eregi tellement c'est évident.

    Mais je me suis dit que preg_replace() serait peut-être plus rapide.
    J'ai bien compris

    Sauf qu'il ne souhaite pas la chaine sans les voyelles, il souhaite le nombre de voyelles dans la chaine

    Citation Envoyé par Oliver-05 Voir le message
    Le but de ce petit exercice est de compter le nombre de voyelles entrées dans un formulaire.

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    si tu veux gérer les accents tu peux faire comme ca
    (bon y'a plein d'autres combinaisons d'accents j'ai mis les principales)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $str = 'héhéoaaÉtç';
    $pattern = '/(?P<vowel>[aeiouy\x{e0}-\x{e6}\x{e8}-\x{ef}\x{f2}-\x{f6}\x{f9}-\x{fd}\x{ff}])|(?P<consonant>[b-df-hj-np-tv-xz\x{e7}\x{f1}])/ui';
    preg_match_all($pattern, $str, $matches);
     
    $vowel 	   = array_filter($matches['vowel']);
    $consonant = array_filter($matches['consonant']);
     
    var_dump(count($vowel), count($consonant));
    /*
    int 6
    int 4
    */
    si tu veux que les voyelles fais juste ca (et pas oublier de mettre le ui):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [aeiouy\x{e0}-\x{e6}\x{e8}-\x{ef}\x{f2}-\x{f6}\x{f9}-\x{fd}\x{ff}]

  20. #20
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Voyelle... e
    Consonne... l
    Voyelle... u
    Consonne... s
    Consonne... r
    Voyelle... o

    tic..tac...tic..tac...tic...tac...

    Résolu !


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/11/2005, 21h20
  2. Compter le nombre de page d'un report
    Par ToYonos dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/06/2003, 09h36
  3. compter le nombre de record
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 12/03/2003, 09h53
  4. [TListView] Compter le nombre de lignes
    Par agh dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2002, 20h25
  5. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41

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