PHP Preg-Заменить более одного подчеркивания

Как я, используя preg_replace, заменяю более одного подчеркивания только одним подчеркиванием?

preg_replace('/[_]+/', '_', $your_string);

Оператор + соответствует нескольким экземплярам последнего символа (или группы захвата).

 $string = preg_replace('/_+/', '_', $string); 

Фактически использование /__+/ или /_{2,}/ будет лучше, чем /_+/ поскольку одно подчеркивание не нужно заменять. Это улучшит скорость варианта preg.

Выполняя тесты, я нашел следующее:

 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 () всегда была быстрее.

Я знаю, что некоторые предпочли бы один метод над другим по причинам, отличным от скорости, и я был бы рад прочитать комментарии относительно результатов, метода тестирования и т. Д.

preg_replace ()

нужен оператор +

 $text = "______"; $text = preg_replace('/[_]+/','_',$text); 

У меня нет причин, по которым вы хотите использовать preg_replace, но что не так:

 str_replace('__', '_', $string); 
 This will Accept Only Characters,numeric value or Special Character found it will replace with _ <?php error_reporting(0); if($_REQUEST) { PRINT_R("<PRE>"); PRINT_R($_REQUEST); $str=$_REQUEST[str]; $str=preg_replace('/[^A-Za-z\-]/', '_', $str); echo strtolower(preg_replace('/_{2,}/','_',$str)); } ?> <form action="" method="post"> <input type="text" name="str"/> <input type="submit" value="submit"/> </form>