Запустив тесты, я нашел это:
while (strpos($str, '__') !== false) {
$str = str_replace('__', '_', $str);
}
чтобы быть последовательно быстрее, чем это:
$str = preg_replace('/[_]+/', '_', $str);
Я сгенерировал тестовые строки различной длины с помощью:
$chars = array_merge(array_fill(0, 50, '_'), range('a', 'z'));
$str = '';
for ($i = 0; $i < $len; $i++) { // $len varied from 10 to 1000000
$str .= $chars[array_rand($chars)];
}
file_put_contents('test_str.txt', $str);
и протестировано с помощью этих сценариев (запускаются отдельно, но с одинаковыми строками для каждого значения $ len ):
$str = file_get_contents('test_str.txt');
$start = microtime(true);
$str = preg_replace('/[_]+/', '_', $str);
echo microtime(true) - $start;
и
$str = file_get_contents('test_str.txt');
$start = microtime(true);
while (strpos($str, '__') !== false) {
$str = str_replace('__', '_', $str);
}
echo microtime(true) - $start;
Для более коротких строк метод str_replace () был на 25% быстрее, чем метод preg_replace () . Чем длиннее строка, тем меньше разница, но str_replace () всегда был быстрее.
Я знаю, что некоторые предпочитают один метод другим по причинам, отличным от скорости, и я был бы рад прочитать комментарии относительно результатов, метода тестирования и т. Д.