Comparatif str_replace, preg_replace

© Christian PAULUS. Document créé le 8 juillet 2007 , mis à jour le 8 juillet 2007.

Les hommes vieillissent toujours mal quand ils restent jeunes. Romain Gary (Au-delà de cette limite...)

Accueil du site > Astuces > PHP > Comparatif str_replace, preg_replace

str, str_replace, ereg_replace, preg_replace / PHP 4.3.0

Petit comparatif sur 4 fonctions PHP de manipulation de chaînes.

Méthodologie : supprime 150 fois les espaces d’une chaîne de caractères.

Les définitions :

<?php
    define
("BR""<br /><br />");
    
    
define("PANGRAMME""Portez ce vieux whisky au juge blond "
        
"qui fume sur son île intérieure, à côté de l'alcôve "
        
"ovoïde, où les bûches se consument dans l'âtre, ce "
        
"qui lui permet de penser à la cœnogenèse de l'être "
        
"dont il est question dans la cause ambiguë entendue "
        
"à Moÿ, dans un capharnaüm qui, pense-t-il, diminue "
        
"çà et là la qualité de son œuvre");

    
define("TEST_LOOP"150);
?>

strtr

strtr ne permet pas de supprimer un caractère. Testé ici pour complément, en remplaçant les espaces par le caractère ’X’.

<?php
    
// test avec strtr
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
strtr(PANGRAMME" ""X");
    }
    
$time microtime() - $time;
    echo (
"strtr => " $time " micro-sec." BR);
?>

strtr => 0.001529 micro-sec.

str_replace

<?php
    
// test avec str_replace
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
str_replace(" """PANGRAMME);
    }
    
$time microtime() - $time;
    echo (
"str_replace => " $time " micro-sec." BR);
?>

str_replace => 0.001742 micro-sec.

ereg_replace

<?php
    
// test avec ereg_replace
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
ereg_replace(" """PANGRAMME);
    }
    
$time microtime() - $time;
    echo (
"ereg_replace => " $time " micro-sec." BR);
?>

ereg_replace => 0.020078 micro-sec.

ereg_replace avec des classes

<?php
    
// test avec ereg_replace + classes
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
ereg_replace("[[:blank:]]"""PANGRAMME);
    }
    
$time microtime() - $time;
    echo (
"ereg_replace using class => " $time " micro-sec." BR);
?>

ereg_replace using class => 0.019416 micro-sec.

preg_replace

<?php
    
// test avec preg_replace
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
preg_replace("/ /"""PANGRAMME);
    }
    
$time microtime() - $time;
    echo (
"preg_replace => " $time " micro-sec." BR);
?>

preg_replace => 0.003088 micro-sec.

preg_replace avec des classes

<?php
    
// test avec preg_replace + classes
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
preg_replace("/[[:blank:]]/"""PANGRAMME);
    }
    
$time microtime() - $time;
    echo (
"preg_replace using class => " $time " micro-sec." BR);
?>

preg_replace using class => 0.006692 micro-sec.

Conclusions

strtr ne permet pas de supprimer un caractère dans une chaîne. Le test sur un simple remplacement ici permet de constater que strtr est très efficace dans le cadre d’un remplacement.

str_replace est le plus rapide du lot, mais ne permet pas l’utilisation de classes regex. Cas d’un remplacement plus complexe ci-dessous.

preg_replace est environ dix fois plus rapide qu’ereg_replace, cinq fois en utilisant les classes.

str_replace vs preg_replace

Méthodologie : supprime 150 fois les voyelles d’un texte.

<?php
    
// test avec str_replace
    // supprime les voyelles
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
$string str_replace("a"""PANGRAMME);
        
$string str_replace("e"""$string);
        
$string str_replace("i"""$string);
        
$string str_replace("o"""$string);
        
$string str_replace("u"""$string);
        
$string str_replace("y"""$string);
    }
    
$time microtime() - $time;
    echo(
$string BR);
    echo(
"str_replace => " $time " micro-sec." BR);
?>
str_replace => 0.007978 micro-sec.

<?php
    
// test avec preg_replace
    // supprime les voyelles
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
$string preg_replace("/[aeiouy]/"""PANGRAMME);
    }
    
$time microtime() - $time;
    echo(
$string BR);
    echo(
"preg_replace => " $time " micro-sec." BR);
?>
preg_replace => 0.007742 micro-sec.

Les résultats sont très proches.

str_replace vs preg_replace #2

Méthodologie : supprime 150 fois 6 mots d’un texte.

<?php
    
// test avec str_replace
    // supprime quelques mots
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
$string str_replace("la"""PANGRAMME);
        
$string str_replace("ce"""$string);
        
$string str_replace("de"""$string);
        
$string str_replace("son"""$string);
        
$string str_replace("dont"""$string);
        
$string str_replace("qui"""$string);
    }
    
$time microtime() - $time;
    echo(
$string BR);
    echo(
"str_replace => " $time " micro-sec." BR);
?>
str_replace => 0.005476 micro-sec.

<?php
    
// test avec str_replace
    // variante de la précédent en utilisant un tableau
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
$string str_replace(array("la","ce","de","son","dont","qui"), ""$string);
    }
    
$time microtime() - $time;
    echo(
$string BR);
    echo(
"str_replace avec tableau => " $time " micro-sec." BR);
?>
str_replace avec tableau => 0.002216 micro-sec.

<?php
    
// test avec preg_replace
    // supprime quelques mots
    
for($time microtime(), $ii 0$ii TEST_LOOP$ii++) {
        
$string preg_replace("/(la|ce|de|son|dont|qui)/"""PANGRAMME);
    }
    
$time microtime() - $time;
    echo(
$string BR);
    echo(
"preg_replace => " $time " micro-sec." BR);
?>
preg_replace => 0.014214 micro-sec.

str_replace l’emporte.

Plussoyez !

Les forums sont fermés.