[PHP] Calculer le pourcentage de majuscules dans une chaine

Calculer le pourcentage de majuscules dans une chaine [PHP] - PHP - Programmation

Marsh Posté le 05-11-2003 à 15:17:13    

Je voudrais pouvoir calculer en PHP le pourcentage de majuscules classiques qui se trouvent dans une chaine. Pour l'instant j'ai écris ca :
 

Code :
  1. $majuscules = 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" );
  2.     $chaine_nettoyee = str_replace($majuscules, "", $chaine);
  3.     echo "Pourcentage de minuscules : ".( (strlen($chaine_nettoyee) / strlen($chai$chainene_test)) * 100 )." %<BR>";


 
Quelqu'un aurait-il un code meilleur à proposer ?
 
J'avais bien pensé à stocker ma chaine en minuscule (grace à strtolower) dans une variable temporaire, et comparer les 2 chaines avec strcmp() mais c'est une fonction que je connais peu, visiblement elle retourne juste 0 ou 1 et non pas le nombre de caractères différents.

Reply

Marsh Posté le 05-11-2003 à 15:17:13   

Reply

Marsh Posté le 05-11-2003 à 16:40:13    

Pourcentage de majuscules :
 

Code :
  1. $chaine = "Chaine A tesTer pOur Les maJuscUles";
  2. echo( preg_match_all( "/[A-Z]/", $chaine, $res ) / strlen( $chaine ) * 100 );


Message édité par Mara's dad le 05-11-2003 à 16:40:55

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-11-2003 à 17:18:55    

Vous avez oublié les lettres ÁÀÉÈÍÌÓÒÚÙÇ ainsi que quelques autres :D

Reply

Marsh Posté le 01-12-2003 à 17:21:40    

Kristoph a écrit :

Vous avez oublié les lettres ÁÀÉÈÍÌÓÒÚÙÇ ainsi que quelques autres :D


 
ctype_upper() ?


Message édité par KrisCool le 01-12-2003 à 17:22:14

---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 01-12-2003 à 17:28:13    

Mara's dad a écrit :

Pourcentage de majuscules :
 

Code :
  1. $chaine = "Chaine A tesTer pOur Les maJuscUles";
  2. echo( preg_match_all( "/[A-Z]/", $chaine, $res ) / strlen( $chaine ) * 100 );




 
les expressions régulières c'ets pas plus lourd en calcul?
surtt si il doit faire de nombreux tests.
Il mes emble que j'avais lu quelquechose sur la lourdeur des expressions régulières  , mais bon ca reste a confirmer. Je ne suis pas sur   ;)

Reply

Marsh Posté le 01-12-2003 à 17:38:02    

Saxgard a écrit :


 
les expressions régulières c'ets pas plus lourd en calcul?
surtt si il doit faire de nombreux tests.
Il mes emble que j'avais lu quelquechose sur la lourdeur des expressions régulières  , mais bon ca reste a confirmer. Je ne suis pas sur   ;)  


 
C'est moins lourd qu'une boucle en PHP avec l'appel de ctype_upper() pour chaque caractère ;)
 
M'enfin, si t'as un autre algo, te fais pas prier.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-12-2003 à 17:50:37    

Mara's dad a écrit :


 
C'est moins lourd qu'une boucle en PHP avec l'appel de ctype_upper() pour chaque caractère ;)
 
M'enfin, si t'as un autre algo, te fais pas prier.


 
pourquoi tu fini toujours par etre désagréable  ca te plait tant que ca
 
c'est juste une question !!
 
mais la boucle , si il ya plusieurs chaine a tester est inévitable aussi avce lamethode de l'expression régulière?
 
 
 

Reply

Marsh Posté le 01-12-2003 à 17:51:33    

sinon bin euh non j'ai pas d'autre solution a proposerc'ets juste que ca 1er solution a quelquechose pres me paraiszait pas tropmal , juste un peu plus longue a ecrire  :D

Reply

Marsh Posté le 01-12-2003 à 18:15:03    

Désolé, c'était pas une attaque :(
 
Je veux juste dire que pour compter les majuscules d'une chaîne de 100 caractères avec ctype_upper(), il faut appeler 100 fois ctype_upper().
 
Quand à ma question de savoir si t'as un algo, ben elle est sincère. Tu demandes :
 

Citation :

les expressions régulières c'est pas plus lourd en calcul?


 
J'ai fait le test en bouclant 100 000 fois pour chaque algo, avec une chaîne de 35 caractères:
 
preg_match_all : 3.48249399662 secondes
str_replace : 4.65074300766 secondes
ctype_upper : 16.9138089418 secondes
 
preg_match_all gagne le match, mais de pas beaucoup :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-12-2003 à 18:25:46    

Mara's dad a écrit :

Désolé, c'était pas une attaque :(
 
Je veux juste dire que pour compter les majuscules d'une chaîne de 100 caractères avec ctype_upper(), il faut appeler 100 fois ctype_upper().
 
Quand à ma question de savoir si t'as un algo, ben elle est sincère. Tu demandes :
 

Citation :

les expressions régulières c'est pas plus lourd en calcul?


 
J'ai fait le test en bouclant 100 000 fois pour chaque algo, avec une chaîne de 35 caractères:
 
preg_match_all : 3.48249399662 secondes
str_replace : 4.65074300766 secondes
ctype_upper : 16.9138089418 secondes
 
preg_match_all gagne le match, mais de pas beaucoup :D


 
pardon j'avais vu ca commeun reukant d'agressivité soudaine   ;)  
 
ah oauis en effet, comme test ca parait assez concluant
par contrec clairq ue le ctype_upper il prend une rouste   :)  

Reply

Marsh Posté le 01-12-2003 à 18:25:46   

Reply

Marsh Posté le 01-12-2003 à 22:42:53    

Normal pour ctype_upper, il y a le temps perdu en appels de fonction, qu'on doit éviter très largement en passant pas les expressions régulières.

Reply

Marsh Posté le 01-12-2003 à 23:48:27    

Le fin du fin :
 
preg_match_all( "/[[:upper:]]/", $test, $x )
 
Retourne le nombre de Majuscules de $test. $x contient la liste des caractères trouvés :
 
Exemple :

Code :
  1. <?php
  2. $test = 'ÁÀÉÈÍÌÓÒÚÙ Chaine A tesTer pOur Les maJuscUles';
  3. echo( preg_match_all( "/[[:upper:]]/", $test, $x ) );
  4. echo( '<hr><pre>' );
  5. print_r( $x );
  6. echo( '</pre>' );
  7. ?>


Résultat :

Code :
  1. 17
  2. --------------------------------------------------------------------------------
  3. Array
  4. (
  5.     [0] => Array
  6.         (
  7.             [0] => Á
  8.             [1] => À
  9.             [2] => É
  10.             [3] => È
  11.             [4] => Í
  12.             [5] => Ì
  13.             [6] => Ó
  14.             [7] => Ò
  15.             [8] => Ú
  16.             [9] => Ù
  17.             [10] => C
  18.             [11] => A
  19.             [12] => T
  20.             [13] => O
  21.             [14] => L
  22.             [15] => J
  23.             [16] => U
  24.         )
  25. )


 
J'ai trouvé l'info là : http://www.perldoc.com/perl5.6/pod [...] xpressions
 

Citation :

The POSIX character class syntax
 
    [:class:]  
 
 
 
 
is also available. The available classes and their backslash equivalents (if available) are as follows:
 
    alpha
    alnum
    ascii
    cntrl
    digit       \d
    graph
    lower
    print
    punct
    space       \s
    upper
    word        \w
    xdigit  
 
 
 
 
For example use [:upper:] to match all the uppercase characters. Note that the [] are part of the [:upper:] construct, not part of the whole character class. For example:
 
    [01[:alpha:]%]  
 
 
 
 
matches one, zero, any alphabetic character, and the percentage sign.


 
C'est pas cité dans la doc PHP, mais çà marche.
Normalement, on peut aussi faire \p{IsUpper}, mais çà ne fonctionne pas avec PHP :(
 
Bref les regexp, y'a plein de façon de faire les choses. Certaines fonctionnent d'autres non, et çà dépend de l'implémentation :fou:


Message édité par Mara's dad le 01-12-2003 à 23:50:25

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-12-2003 à 09:34:48    

J'ai honte de pas avoir pensé à [[:upper:]]
Je suis un gland. :/


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 02-12-2003 à 09:50:07    

Pas moi :sol:
J'ai appris un truc et çà me plait :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 15-11-2007 à 23:48:36    

Encore mieux !
 

Code :
  1. $subject = 'Ce SujEt ComPorTe Un gRanD PourCenTaGE DE caRactEres En MajuSCuleS';
  2. $subject = str_replace(' ','',$subject);
  3. $pourcentage = levenshtein ($subject, strtolower($subject))*100/strlen($subject);
  4. echo 'il y a' . $pourcentage . '% de majuscules dans ce texte'


 
trouvé sur nexen.


---------------
GENERATION MOBILES : Imprimantes GSM & logos/sonneries/jeux
Reply

Marsh Posté le 16-11-2007 à 01:37:23    

oui mais ça retourne le pourcentage de la chaine aussi, ce que ne fait pas la fonction plus haut décrite par Mara's dad.


---------------
GENERATION MOBILES : Imprimantes GSM & logos/sonneries/jeux
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed