PHP Preg-Reemplazar más de un guion bajo

¿Cómo puedo, usando preg_replace, reemplazar más de un guión bajo con solo un guión bajo?

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

El operador + coincide con varias instancias del último carácter (o grupo de captura).

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

En realidad, usar /__+/ o /_{2,}/ sería mejor que /_+/ ya que no es necesario reemplazar un guión bajo único. Esto mejorará la velocidad de la variante preg.

Ejecutando pruebas, encontré esto:

 while (strpos($str, '__') !== false) { $str = str_replace('__', '_', $str); } 

ser consistentemente más rápido que esto:

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

Genere las cadenas de prueba de diferentes longitudes con esto:

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

y probado con estos scripts (ejecutados por separado, pero en cadenas idénticas para cada valor de $ len ):

 $str = file_get_contents('test_str.txt'); $start = microtime(true); $str = preg_replace('/[_]+/', '_', $str); echo microtime(true) - $start; 

y:

 $str = file_get_contents('test_str.txt'); $start = microtime(true); while (strpos($str, '__') !== false) { $str = str_replace('__', '_', $str); } echo microtime(true) - $start; 

Para cadenas más cortas, el método str_replace () era tanto como un 25% más rápido que el método preg_replace () . Cuanto más larga sea la cadena, menor será la diferencia, pero str_replace () siempre fue más rápido.

Sé que algunos preferirían un método sobre el otro por razones distintas a la velocidad, y me gustaría leer comentarios sobre los resultados, el método de prueba, etc.

preg_replace ()

el operador + es necesario

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

No sé por qué quieres usar preg_replace, pero qué pasa con:

 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("
"); PRINT_R($_REQUEST); $str=$_REQUEST[str]; $str=preg_replace('/[^A-Za-z\-]/', '_', $str); echo strtolower(preg_replace('/_{2,}/','_',$str)); } ?>