Aller au contenu

problème simple d'expression régulière


Imp

Sujets conseillés

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é par Imp
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 belle

if(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

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

  • 1 year later...
Posté (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

:wacko:

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é par Imp
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...