Comparison of String Replacement Functions

Measure the speed of str_replace, strtr, and preg_replace with strings of different lengths and number of replacements.

single
Change a single character to another character.
multi
Change multiple single characters to other single characters.
lengthen
Change a single character to a longer substring.
lengthen multi
Change multiple single characters to longer substrings.
shorten
Change multi-character substrings to a shorter substring.

Chart showing function speed

The times for preg_replace were omitted because it is almost always higher than the other functions. strtr generally outperforms str_replace except where the string changes length.

time-string-replace.php
<?php
 
$ITER = 100000;
 
$short5 = "abcde:abcde";
$short2 = "ab:cdeabcde";
$short8 = "abcdeabc:de";
$short28 = "ab:cdeabc:de";
$short258 = "ab:cde:abc:de";
$shortmany = "a:b:c:d:e:f";
$med5 = str_repeat("abcde",2).':'.str_repeat("abcde",3);
$med2 = str_repeat("abcde",1).':'.str_repeat("abcde",4);
$med8 = str_repeat("abcde",4).':'.str_repeat("abcde",1);
$med28 = str_repeat("abcde",1).':'.str_repeat("abcde",3).':'.str_repeat("abcde",1);
$med258 = str_repeat("abcde",1).':'.str_repeat("abcde",2).':'.str_repeat("abcde",2).':'.str_repeat("abcde",1);
$medmany = str_repeat("a:b:c:d:e:",4).'f';
$long5 = str_repeat("abcde",20).':'.str_repeat("abcde",20);
$long2 = str_repeat("abcde",8).':'.str_repeat("abcde",32);
$long8 = str_repeat("abcde",32).':'.str_repeat("abcde",8);
$long28 = str_repeat("abcde",8).':'.str_repeat("abcde",24).':'.str_repeat("abcde",8);
$long258 = str_repeat("abcde",8).':'.str_repeat("abcde",12).':'.str_repeat("abcde",12).':'.str_repeat("abcde",8);
$longmany = str_repeat("a:b:c:d:e:",20).'f';
 
print("\t");
print("short5\tshort2\tshort8\tshort28\tshort258\tshort-many\t");
print("med5\tmed2\tmed8\tmed28\tmed258\tmed-many\t");
print("long5\tlong2\tlong8\tlong28\tlong258\tlong-many\n");
 
function runtest($func){
  global $short5,$short2,$short8,$short28,$short258,$shortmany;
  global $med5,$med2,$med8,$med28,$med258,$medmany;
  global $long5,$long2,$long8,$long28,$long258,$longmany;
  $func($short5);
  $func($short2);
  $func($short8);
  $func($short28);
  $func($short258);
  $func($shortmany);
  $func($med5);
  $func($med2);
  $func($med8);
  $func($med28);
  $func($med258);
  $func($medmany);
  $func($long5);
  $func($long2);
  $func($long8);
  $func($long28);
  $func($long258);
  $func($longmany);
  print("\n");flush();
}
function test0($s){
    $a = str_replace(':','/',$s);
    $b = strtr($s,':','/');
    $c = preg_replace('/:/','/',$s);
    if($a!=$b || $b!=$c){
      print("str_replace: $a\nstrtr: $b\npreg_replace: $c\n");
      exit(1);
    }
    $a = str_replace(array('a','e'),array('_','_'),$s);
    $b = strtr($s,array('a'=>'_','e'=>'_'));
    $bb = strtr($s,'ae','__');
    $c = preg_replace('/[ae]/','_',$s);
    if($b!=$bb){
      print("strtr1: $b\nstrtr2: $bb\n\n");
      exit(1);
    }
    if($a!=$b || $b!=$c){
      print("str_replace: $a\nstrtr: $b\npreg_replace: $c\n");
      exit(1);
    }
    $a = str_replace(':','%3A',$s);
    $b = strtr($s,array(':'=>'%3A'));
    $c = preg_replace('/:/','%3A',$s);
    if($a!=$b || $b!=$c){
      print("str_replace: $a\nstrtr: $b\npreg_replace: $c\n");
      exit(1);
    }
    $a = str_replace(array(':','/'),array('%3A','%2F'),$s);
    $b = strtr($s,array(':'=>'%3A','/'=>'%2F'));
    if($a!=$b){
      print("str_replace: $a\nstrtr: $b\n");
      exit(1);
    }
    $a = str_replace('de','',$s);
    $b = strtr($s,array('de'=>''));
    $c = preg_replace('/de/','',$s);
    if($a!=$b || $b!=$c){
      print("str_replace: $a\nstrtr: $b\npreg_replace: $c\n");
      exit(1);
    }
}
function test1($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = str_replace(':','/',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test2($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = strtr($s,':','/');
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test3($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = preg_replace('/:/','/',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test4($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = str_replace(array('a','e'),array('_','_'),$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test5($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = strtr($s,array('a'=>'_','e'=>'_'));
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test6($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = strtr($s,'ae','__');
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test7($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = preg_replace('/[ae]/','_',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test8($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = str_replace(':','%3A',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test9($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = strtr($s,array(':'=>'%3A'));
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test10($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = preg_replace('/:/','%3A',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test11($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = str_replace(array(':','/'),array('%3A','%2F'),$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test12($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = strtr($s,array(':'=>'%3A','/'=>'%2F'));
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test13($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = str_replace('de','',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test14($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = strtr($s,array('de'=>''));
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
function test15($s){
  global $ITER;
  $t1 = xdebug_time_index();
  for($i=0;$i<$ITER;$i++){
    $b = preg_replace('/de/','',$s);
  }
  $t2 = xdebug_time_index();
  print("\t");print($t2-$t1);flush();
}
 
print('"single str_replace"');flush();
runtest('test1');
print('"single strtr"');flush();
runtest('test2');
print('"single preg_match"');flush();
runtest('test3');
print('"multi str_replace"');flush();
runtest('test4');
print('"multi strtr"');flush();
runtest('test6');
print('"multi strtr array"');flush();
runtest('test5');
print('"multi preg_replace"');flush();
runtest('test7');
print('"lengthen str_replace"');flush();
runtest('test8');
print('"lengthen strtr"');flush();
runtest('test9');
print('"lengthen preg_replace"');flush();
runtest('test10');
print('"lengthen multi str_replace"');flush();
runtest('test11');
print('"lengthen multi strtr"');flush();
runtest('test12');
print('"shorten str_replace"');flush();
runtest('test13');
print('"shorten strtr"');flush();
runtest('test14');
print('"shorten preg_replace"');flush();
runtest('test15');