Supprimer mot de 3 caractères maxi dans une chaine - RESOLU [PHP] - PHP - Programmation
Marsh Posté le 14-06-2005 à 18:48:46
Salut,
tu peux essayer ça :
Code :
|
Marsh Posté le 14-06-2005 à 18:53:43
heu oui, mais non
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 ?
Marsh Posté le 14-06-2005 à 19:20:57
oui c'est faux.
Dans la boucle foreach()je propose :
Code :
|
et à la fin en refaire une chaine avec implode()
Marsh Posté le 14-06-2005 à 19:22:40
Oups putain dsl j'ai oublié la condition sur la longueur du mot...
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.
Marsh Posté le 14-06-2005 à 19:25:25
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
ce que je comprends pas, c'est pourquoi ca n'en prends qu'un sur 2
Marsh Posté le 14-06-2005 à 19:41:26
ta regex n'est pas forcément plus rapide.
Mais bon, je peux me tromper...
Marsh Posté le 14-06-2005 à 20:04:21
Code :
|
essaye avec ça (dans ta fonction callback, $txt[0] deviens biensûr $txt[1]).
Marsh Posté le 14-06-2005 à 20:09:58
merci mais nan
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 )
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)
Marsh Posté le 14-06-2005 à 20:13:48
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
Marsh Posté le 14-06-2005 à 20:29:38
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
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 , mais ca ne fonctionne pas, pourquoi ?
j'aimerais comprends où se trouve l'erreur !!
Marsh Posté le 14-06-2005 à 20:38:37
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 :
|
Marsh Posté le 14-06-2005 à 20:56:08
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 )
Marsh Posté le 14-06-2005 à 21:03:14
c'est une possibilité flo850, qqn peut confirmer ? si oui, comment empecher cela ?
Marsh Posté le 14-06-2005 à 21:05:39
spark a écrit : Hello, je souhaiterais supprimer tous les mots qui font moins de 3 caractères dans une chaine.
|
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}
Marsh Posté le 14-06-2005 à 21:27:24
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
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
Marsh Posté le 14-06-2005 à 21:36:10
$pattern = '#(?<=\-)[a-z]{1,3}(?=\-)#i';
Pour matcher les mots de 3 lettres ou moins separés pas un '-'
Marsh Posté le 14-06-2005 à 21:42:24
http://www.lumadis.be/regex/tuto_pcre.php
(?<= etc ... c'est des assertions positives/negatives avant/arriere
Marsh Posté le 14-06-2005 à 18:34:23
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
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
Merci de m'indiquer mon erreur
Message édité par spark le 14-06-2005 à 21:27:46