Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1847 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Supprimer mot de 3 caractères maxi dans une chaine - RESOLU

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Supprimer mot de 3 caractères maxi dans une chaine - RESOLU

n°1119901
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 18:34:23  profilanswer
 

Hello, je souhaiterais supprimer tous les mots qui font moins de 3 caractères dans une chaine.
Et si je suis là, c'est que j'y arrive pas :D


  function fun($txt)
  {
    echo "<br />Match: ".$txt[0]."<br /><br />";  
    return ' ';
  }
 
  $txt = "aa bb xxxx ccc dd\nee ff yyyy gg\nhh ii j k l mm zzzz";
 
  $txt = str_replace("\n", ' ', $txt); // On vire les sauts de ligne
 
  echo preg_replace_callback('/ ([a-z]{1,3}) /', 'fun', ' '.$txt.' ');
 


J'obtiens le résultat suivant:


Match: aa  
 
 
Match: ccc  
 
 
Match: ee  
 
 
Match: gg  
 
 
Match: ii  
 
 
Match: k  
 
 
Match: mm  
 
bb xxxx dd ff yyyy hh j l zzzz  


alors qu'il ne devrait me rester que "xxxx yyyy zzzz" (avec une certaine quantités d'espaces dans la chaine)
 
Si qqn voit le pb, je suis sur que c'est tout con...
 
D'ailleurs, je viens de remarquer un truc, ca saute 1 élément à trouver sur 2  :sweat:  
 
Merci de m'indiquer mon erreur :)


Message édité par spark le 14-06-2005 à 21:27:46
mood
Publicité
Posté le 14-06-2005 à 18:34:23  profilanswer
 

n°1119909
j_lecruel
☀ ☁ ☂
Posté le 14-06-2005 à 18:48:46  profilanswer
 

Salut,
 
tu peux essayer ça :
 

Code :
  1. $words = "a bb ccc d eeee ff";
  2. $tabwords = explode(" ",$words);
  3. foreach($tabwords as $word)
  4. {
  5.    $words = str_replace($word,'',$words);
  6. }


 

n°1119913
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 18:53:43  profilanswer
 

heu oui, mais non :D
ca supprime tout les mots ton code et pis je prefere utiliser une regex plutot qu'un explode+for+str_replace
a mon avis, ca sera plus rapide nan ?

n°1119927
ritzle
Posté le 14-06-2005 à 19:20:57  profilanswer
 

oui c'est faux.
 
Dans la boucle foreach()je propose :

Code :
  1. if( strlen($word) > 3 )
  2. {
  3. array_push( $tab, $word );
  4. }


 
et à la fin en refaire une chaine avec implode()

n°1119928
j_lecruel
☀ ☁ ☂
Posté le 14-06-2005 à 19:22:40  profilanswer
 

Oups putain dsl j'ai oublié la condition sur la longueur du mot... :ange:  
 
Sinon ben ça n'est qu'UNE solution, perso je suis pas encore à l'aise avec les regex...après niveau perf' je pense que tu as raison.

n°1119930
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 19:25:25  profilanswer
 

oui, j'avais compris pour l'oubli du test de la longueur :)
mais je trouve que ca fait bcp de bidouille et vu que le temps d'execution est primordial pour moi, va falloir qu'on trouve la bonne regex :D
 
ce que je comprends pas, c'est pourquoi ca n'en prends qu'un sur 2

n°1119943
ritzle
Posté le 14-06-2005 à 19:41:26  profilanswer
 

ta regex n'est pas forcément plus rapide.
Mais bon, je peux me tromper...

n°1119955
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 19:58:20  profilanswer
 

je ferai un bench :D

n°1119959
Martius
Pas stable
Posté le 14-06-2005 à 20:04:21  profilanswer
 

Code :
  1. '/(^|\W)([a-z]{1,3})(\W|$)/'


essaye avec ça (dans ta fonction callback, $txt[0] deviens biensûr $txt[1]).


---------------
Martin
n°1119965
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 20:09:58  profilanswer
 

merci :D mais nan :D
je viens de tester, ca change rien.
Je suis d'autant plus perplexe que j'avais déjà essayé un truc dans le genre et que ta regex me semble vraiment appropriée. Tu prends vraiment en compte les bons cas cad: mot en debut ou fin de chaine, et non mots entre chaques mot de 3 lettres maxi (j'me comprends :D)
 
Pourtant, c'est le meme résultat, cad qu'il manque la moitié des matchs...
 
(ps: et dans le callback, c'est toujours $txt[0] qui contient l'intégralité de la chaine matchée)

mood
Publicité
Posté le 14-06-2005 à 20:09:58  profilanswer
 

n°1119974
Martius
Pas stable
Posté le 14-06-2005 à 20:13:48  profilanswer
 

Citation :

(ps: et dans le callback, c'est toujours $txt[0] qui contient l'intégralité de la chaine matchée)


J'ai du loupé un truc alors, les regex c'est pas mon point fort :/


---------------
Martin
n°1119996
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 20:29:38  profilanswer
 

tu confonds avec les references aux parentheses pour les regex
 
genre si t'as ([a-z]{2})(-)([a-z]{2}), tu peux recup un truc de la parenthese avec son numéro genre $1 ou $2 ou \1 ou \2 je c plus la syntaxe :D
 
dans le cas du callback, ca renvoie un tableau avec la chaine trouvée dans un tableau à l'indice 0
 
bref, ta regex semble juste, je suis d'accord avec elle :D, mais ca ne fonctionne pas, pourquoi ?
j'aimerais comprends où se trouve l'erreur !!

n°1120009
Martius
Pas stable
Posté le 14-06-2005 à 20:38:37  profilanswer
 

Ah ! Oui oui d'accord ;)
syntaxe : $1 et \\1 possibles :)
 
Je regarde, mais là je séche :/
 
a mon avis, il y a peut-être un problème d'espaces en trop ou manquants...
 
Bon, histoire d'essayer :

Code :
  1. '/(^|\W)([a-z]{1,3})(\W|$)/si'


---------------
Martin
n°1120026
flo850
moi je
Posté le 14-06-2005 à 20:56:08  profilanswer
 

et dans l'auter sens ?  
ne conserver que lesmots deplus de 4 caractères  
 
parceque la , tu essaye de virer les mots de 3 ou moins  
 
sinon, pour le un sur deux c'est peut etre du au fait que si  tu match dans _aa_bb_ ( _ = espace ) , il va reconnaitre _aa_, donc ta chaine sera bb_ ( qui ne correspond aps a ton pattern )


---------------

n°1120030
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 21:03:14  profilanswer
 

c'est une possibilité flo850, qqn peut confirmer ? si oui, comment empecher cela ? :D

n°1120032
afbilou
pouet your life
Posté le 14-06-2005 à 21:05:39  profilanswer
 

spark a écrit :

Hello, je souhaiterais supprimer tous les mots qui font moins de 3 caractères dans une chaine.
Et si je suis là, c'est que j'y arrive pas :D


  function fun($txt)
  {
    echo "<br />Match: ".$txt[0]."<br /><br />";  
    return ' ';
  }
 
  $txt = "aa bb xxxx ccc dd\nee ff yyyy gg\nhh ii j k l mm zzzz";
 
  $txt = str_replace("\n", ' ', $txt); // On vire les sauts de ligne
 
  echo preg_replace_callback('/ ([a-z]{1,3}) /', 'fun', ' '.$txt.' ');
 


J'obtiens le résultat suivant:


Match: aa  
 
 
Match: ccc  
 
 
Match: ee  
 
 
Match: gg  
 
 
Match: ii  
 
 
Match: k  
 
 
Match: mm  
 
bb xxxx dd ff yyyy hh j l zzzz  


alors qu'il ne devrait me rester que "xxxx yyyy zzzz" (avec une certaine quantités d'espaces dans la chaine)
 
Si qqn voit le pb, je suis sur que c'est tout con...
 
D'ailleurs, je viens de remarquer un truc, ca saute 1 élément à trouver sur 2  :sweat:  
 
Merci de m'indiquer mon erreur :)


 
Ca ne fonctionne pas car dans ton pattern tu specifies des espaces avant et apres le mot de 3 lettres or ces espaces sont consommés si il y a une concordance !
exemple :
aa bb ccc xxxx
aa  -> pas matché car par d'espace avant
bb  -> matché car preg trouve _bb_
ccc -> pas matché car l'espace avant ccc a été consommé lors du matche de bb
 
Pour resoudre ca il te fait remplacer les espaces ... par des espaces qui ne soient pas consommés par le pattern !
Solution : utiliser '\b' (blanc non concommateur de caractere) au lieu de tes espaces avant et apres le [a-z]{1,3}

n°1120051
spark
Un eclair dans la nuit
Posté le 14-06-2005 à 21:27:24  profilanswer
 

afbilou, je te dis un grand MERCI !!
non seulement, tu as résolu mon problème, mais en plus, je m'endormirai moins con ce soir :D
Je ne savais pas que le patern consommait tous les caracteres matchés :)
Merci beaucoup :)
 
pour tcellerier, appeler la fonction 2x c'est pas top quand même je trouve :)

n°1120056
afbilou
pouet your life
Posté le 14-06-2005 à 21:36:10  profilanswer
 

$pattern = '#(?<=\-)[a-z]{1,3}(?=\-)#i';
 
Pour matcher les mots de 3 lettres ou moins separés pas un '-'

n°1120059
flo850
moi je
Posté le 14-06-2005 à 21:37:44  profilanswer
 

:jap:


---------------

n°1120063
afbilou
pouet your life
Posté le 14-06-2005 à 21:42:24  profilanswer
 

http://www.lumadis.be/regex/tuto_pcre.php
(?<= etc ... c'est des assertions positives/negatives avant/arriere


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Supprimer mot de 3 caractères maxi dans une chaine - RESOLU

 

Sujets relatifs
Modifier le style dans une fonction (résolu)Comparaison de chaines de caractères (dates)
[vb.net] Contrôle des caractères saisis dans une InputBoxscripts PHP pour la gestion d'une mailing list ?
Supprimer les espaces ?importation fichier DBF sous MYSQL[résolu]
Erreur transfert ftp en PHP (je ne comprends pas...)ouverture d'un fichier à partir dune chaine de caractere
[PHP] Ajout panier écrase le précédentsupprimer automatiquement des entrées dans un table sql
Plus de sujets relatifs à : [PHP] Supprimer mot de 3 caractères maxi dans une chaine - RESOLU


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR