Imp Posté 15 Janvier 2007 Posté 15 Janvier 2007 (modifié) Bonjour, Je voudrais remplacer toutes les virgules par des virgules suivies d'un saut de ligne (str_replace(",", ",\n", $texte);) Mais ceci non dans tout $texte, mais seulement pour ce qui se trouve entre les balises <pre> et </pre> de ce $texte Et là je galère... Merci à qui me donnera un peu d'aide Modifié 15 Janvier 2007 par Imp
Imp Posté 18 Janvier 2007 Auteur Posté 18 Janvier 2007 Resalut, Est-ce au moins possible ? Par exemple : $texte = "c'est <i>toto</i> le héros" Est-ce qu'il y a un moyen de remplacer tous les "o" par des "i", mais seulement entre <i> et </i> de sorte que le résultat soit "c'est <i>titi</i> le héros" Y aurait-il un moyen ? Merci d'avance
klerthis Posté 19 Janvier 2007 Posté 19 Janvier 2007 Salut, pour le remplacement des lettres, voici la solution. Tu n'a plus qu'à adapter pour les virgules et les pre. $texte = "c'est <i>toto</i> le héros et <i>tata</i> la belle ";echo "$texte<br>"; // -> c'est <i>toto</i> le héros et <i>tata</i> la belleif(preg_match_all("|<i>([^<]*)</i>|",$texte,$out,PREG_SET_ORDER )) { if(is_array($out)) { foreach($out as $tab_ch) { $tag=$tab_ch[0]; // -> <i>toto</i> $mot=$tab_ch[1]; // -> toto $mot_remplace=str_replace(array("o","a"),"i",$mot); // -> titi $tag_remplace=str_replace($mot,$mot_remplace,$tag); // -> <i>titi</i> $texte=str_replace($tag,$tag_remplace,$texte); } }}echo "$texte<br>" // c'est titi le héros et titi la belle
Imp Posté 21 Janvier 2007 Auteur Posté 21 Janvier 2007 Merci beaucoup klerthis, c'est ce qu'il me fallait
Sarc Posté 21 Janvier 2007 Posté 21 Janvier 2007 Salut J'ai lu quelqu'un que l'option e de preg_replace est "mauvaise", mais j'ai pas eu plus d'information sur le sujet... Enfin bon, j'ai quand même une solution plus rapide à te proposer : $texte = preg_replace("#\<pre>(.+?)\</pre>#e", "'<pre>'.(str_replace(',', ' ', '$1')).'</pre>'",$texte); Et pour titi $texte = preg_replace("#\<i>(.+?)\</i>#e", "'<pre>'.(str_replace('o', 'i', '$1')).'</pre>'",$texte); Si quelqu'un passe dans le coin et peut m'expliquer pourquoi l'option e est mauvaise, qu'il n'hésite pas... Edit : avec deux trois recherches supplémentaires, il semblerait qu'elle soit peu rapide... Mais on conseille également l'utilisation de preg_replace_callback. function remplace_virg($texte){ return '<pre>'.(str_replace(',', '<br>', $texte[1])).'</pre>';}$test = preg_replace_callback("#\<pre>(.+?)\</pre>#", remplace_virg, $texte); Tu peux essayer avec ça... sans garanties d'optimisation !
Imp Posté 19 Mai 2008 Auteur Posté 19 Mai 2008 (modifié) Tout d'abord je te remercie Sarc, avec beaucoup de retard, pour ta réponse Alors j'ai testé les trois méthodes avec un fichier contenant 10 000 fois la ligne "c'est <i>toto</i> le héros et <i>tata</i> la belle" (test en local sur un ordi peu puissant avec PHP 5) méthode 1 #!/usr/bin/php<?$texte = file_get_contents("/home/moi/test.txt");if(preg_match_all("|<i>([^<]*)</i>|",$texte,$out,PREG_SET_ORDER )) { if(is_array($out)) { foreach($out as $tab_ch) { $tag=$tab_ch[0]; $mot=$tab_ch[1]; $mot_remplace=str_replace(array("o","a"),"i",$mot); $tag_remplace=str_replace($mot,$mot_remplace,$tag); $texte=str_replace($tag,$tag_remplace,$texte); } }}?> time : real 1m50.537s user 1m28.810s sys 0m11.309s méthode 2 #!/usr/bin/php<?$texte = file_get_contents("/home/moi/test.txt");$texte = preg_replace("#(<i>.+?</i>)#e", "(str_replace(array('o','a'),'i', '$1'))",$texte);?> time : real 0m0.688s user 0m0.644s sys 0m0.028s méthode 3 #!/usr/bin/php<?$texte = file_get_contents("/home/moi/test.txt");function remplace($texte){return str_replace(array('o','a'),'i', $texte[1]);}$texte = preg_replace_callback("#(<i>.+?</i>)#", remplace, $texte);?> time : real 0m0.245s user 0m0.220s sys 0m0.024s Donc la différence est assez nette : avec la première méthode, j'avais le temps d'aller boire un café, la seconde avec preg_replace et le modificateur e est deux à trois fois plus lente que la troisième avec preg_replace_callback. Concernant le deuxième exemple, avec preg_replace, j'obtiens un résultat un peu plus rapide avec "preg_replace('@[ao]@', 'i', ..." au lien de "str_replace(array('o','a'), 'i'" Donc au final la dernière avec preg_replace_callback est bien le mieux, merci sarc ! Modifié 19 Mai 2008 par Imp
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant