Optimisation PHP le retour : strtr vs str_replace

PHP

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) :

str_replace vs strtr

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);

str_replace vs str_replace

7 commentaires pour “Optimisation PHP le retour : strtr vs str_replace”

  1. Romain dit :

    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

  2. dew dit :

    Très intéressant :)

    La méthode que tu proposes est plus performante.
    Merci pour cette suggestion

  3. Numis dit :

    Comment vous faites pour faire ces test là??? Ca a l’air super ce truc!!!

  4. Popov dit :

    $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 :)

  5. author en retard dit :

    $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…

  6. Mazzu dit :

    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.

  7. Oxyd dit :

    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;
    }

Laisser un commentaire