Quitar espacios extra de string con PHP

Introducción

Como probablemente sabrás existe en PHP una función en PHP llamada trim. Cuyo funcionamiento básico es quitar los espacios sobrantes a la izquierda y a la derecha de un string dado. Por ejemplo

1
2
3
4
5
<?php
   //String con espacios sobrantes
   $string = "  En un lugar de la Mancha  ";
   echo trim($string);
?>

La salida sería el string sin los espacios del principio y el final:

En un lugar de la Mancha

El problema surge cuando tenemos un string con espacios sobrantes en mitad del string. Algo como esto:

1
2
3
4
5
<?php
   //String con espacios sobrantes en la mitad
   $string_complicado = "  En un          lugar de la Mancha  ";
   echo trim($string_complicado);
?>

En este caso trim no funciona, dado que no hace nada con los que están en medio. Por tanto necesitamos una alternativa para hacer esto, una alternativa en forma de función claro.

Función para quitar los espacios repetidos

Aquí se plantean varias alternativas, una posible solución podría ser con expresiones regulares, pero quizá sea menos clara. Así que utilicemos la función que sale en un comentario de la página de documentación de trim, y añadámosle la línea “$ret_str = “”;” para evitar un error de PHP, la función completa quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
function quitar_espacios_extra($str)
{
	//Utilizamos trim antes de empezar
	$str = trim($str);	   
 
	//Inicializamos el string que devolvemos
	$ret_str ="";
 
	//Recorremos el string
	for($i=0;$i < strlen($str);$i++) {
		/*Si estamos en algo que no es un espacio, seguimos copiando el 
		string de entrada al de salida */
		if(substr($str, $i, 1) != " ") {
			$ret_str .= trim(substr($str, $i, 1));
		} else {
			/*Si es un espacio nos lo saltamos, aumentando el contador i del bucle*/
			while(substr($str,$i,1) == " "){
				$i++;
			}		
 
			/* Dado que no queremos quitar todos los espacios, sino solo los repetidos
			añadimos un espacio después de habernos
			saltado un nº indeterminado de ellos SI nos saltamos uno, ponemos uno
			SI nos saltamos 20, ponemos uno igual */
			$ret_str.= " ";
			$i--;
		}
	}
	return $ret_str;
}		   
?>

Con esta función, usándolo con el string anterior:

1
2
3
4
5
6
<?php
 //String con espacios sobrantes en la mitad
$string_complicado = "  En un          lugar de la Mancha  ";      
 
echo quitar_espacios_extra($string_complicado); 
?>

La salida sería:

En un lugar de la Mancha

Cualquier duda o error como siempre a la sección de comentarios.