Optimisation PHP le retour : strtr vs str_replace
Pour remplacer des mots précis dans une chaîne de texte il existe plusieurs méthodes. Les plus évidentes sont :
- La fonction strtr associée à un tableau contenant les chaînes à traduire.
- Une simple série de str_replace.
Exemple pratique avec des BBtags :
Le tableau d'éléments à remplacer pour strtr :
$arr=array('[/#]'=>'</span>', '[b]'=>'<b>', '[/b]'=>'</b>', '[i]'=>'<i>', '[/i]'=>'</i>', '[quote]'=>'<blockquote>', '[/quote]'=>'</blockquote>');
Le texte de test bidon :
$texte='In a [b]recent article[/b], former TRG CEO Jeff V. Merkey had offered to pay [i]50K USD for a BSD-licensed[/i] Linux. [quote]Groklaw did a followup on his offer[/quote], to which [#red]Jeff responded by notifying the FBI of Groklaws hate crimes violation[/#]. Merkey doesnt exactly have a great record, either, which is made even more apparent by his recent threats to file suit against Merkey.net for slander and [i]trademark infringement[/i], amongst others. In addition, he has also reported [b]Merkey.net[/b] to the FBIs hate crime department. What could Merkey.net do to get Jeff V. Merkey off their backs ?';
Avec str_replace :
$texte=str_replace('[/#]','</span>',$texte);
$texte=str_replace('[b]','<b>',$texte);
$texte=str_replace('[/b]','</b>',$texte);
$texte=str_replace('[i]','<i>',$texte);
$texte=str_replace('[/i]','</i>',$texte);
$texte=str_replace('[quote]','<blockquote>',$texte);
$texte=str_replace('[/quote]','</blockquote>',$texte);
Avec strtr :
$texte=strtr($texte,$arr);
Résultat sur 10000 itérations (temps en millisecondes) :
Conclusion : str_replace reste la solution la plus performante même si l'écriture est plus longue et moins souple.
Mise à jour : Sur la suggestion de Romain, la solution exploitant des tableaux avec str_replace mérite encore plus d'attention.
str_replace avec tableau :
$pattern = array('[b]', '[/b]', '[i]', '[/i]');
$repl = array('<b>', '</b>', '<i>', '</i>');
$texte = str_replace( $pattern, $repl, $texte);
1 novembre 2004 à 16:08
Il est possible de faire passer des tableaux en paramètres pour str_replace. Ce qui peut donner :
$pattern = array(‘[b]’, ‘[/b]’, ‘[i]’, ‘[/i]’);
$repl = array(‘<b>’, ‘</b>’, ‘<i>’, ‘</i>’);
$texte = str_replace( $pattern, $repl, $texte);
Pourrais tu voir, si vavec ta moulinette, le résultat est le même ?
Romain
1 novembre 2004 à 20:52
Très intéressant :)
La méthode que tu proposes est plus performante.
Merci pour cette suggestion
28 novembre 2004 à 17:01
Comment vous faites pour faire ces test là??? Ca a l’air super ce truc!!!
19 mai 2005 à 20:31
$texte = ‘abcdef’;
$pattern = array(‘abc’, ‘def’);
$repl = array(‘def’, ‘abc’);
str_replace( $pattern, $repl, $texte) => ‘abcabc’
/!\ MAIS !!! /!\
strtr( $pattern, $repl, $texte) => ‘defabc’
Ces fonctions ne font pas exactement la même chose :) strtr, malgré une plus grande lenteur est parfois plus pratique :)
16 février 2006 à 09:51
$pattern = array(‘[b]’, ‘[/b]’, ‘[i]’, ‘[/i]’);
$pattern2 = array(‘/[b]/’,’/[\/b]/’, ‘/[i]/’, ‘/[\/i]/’);
$repl = array(‘<b>’, ‘</b>’, ‘<i>’, ‘</i>’);
$texte = str_replace( $pattern, $repl, $texte);
$texte = preg_replace($pattern2, $repl, $texte);
==> implique le problème du: faut il privilégier le temps d’éxécution à l’espace disque (10 ‘/’ en plus) ou le contraire? preg_replace est bien plus rapide que str_replace…
2 mai 2006 à 17:58
En réponse à author en retard je dirais que preg_replace n’est pas plus rapide que str_replace, au contraire. preg_replace utilise les expressions rationnelles ce qui le rend plus lent que str_replace. Il est d’ailleurs conseillé de ne pas utilisé preg_replace quand un simple str_replace suffit (cf. http://www.php.net/manual/en/fun...
Tu confonds peut être avec ereg_replace qui utilise des expressions rationnelles non compatible Perl et qui est aussi plus lent.
4 mai 2007 à 15:50
Voila une fonction qui s’utilise comme strtr mais qui est plus rapide
function strtr2($texte,$arr,$arr2=false)
{
while(list($k,$v)=each($arr))
{
if($arr2==false) $texte=str_replace($k,$v,$texte); else $texte=str_replace($v,$arr2[$k],$texte);
}
return $texte;
}