Eliminar el exceso de espacios en blanco de una cadena

132

Recibo una cadena de una consulta de base de datos, luego elimino todas las etiquetas HTML, retornos de carro y nuevas líneas antes de ponerlo en un archivo CSV. Lo único es que no puedo encontrar una manera de eliminar el exceso de espacio en blanco entre las cadenas.

¿Cuál sería la mejor manera de eliminar los espacios en blanco internos?

joepour
fuente
66
Por favor, publique una muestra de la cadena original y la cadena deseada.
Zote el
¿Puedes también aclarar cómo debe ser el resultado final? ¿Está insertando las comas en los datos para CSV, obteniéndolo de una base de datos con comas ya dentro, introduciendo cadenas en una función que maneja la inserción de CSV, etc.?
Frank DeRosa el
ok, la salida final debe ser una cadena con cada palabra separada por un solo espacio en blanco, en este momento es un espacio en blanco múltiple.
joepour el
1
@ Joe, ¡no perdería el tiempo y comenzaría a dar crédito a todos los que te han ayudado antes! :)
Frankie

Respuestas:

286

No estoy seguro exactamente de lo que quieres, pero aquí hay dos situaciones:

  1. Si sólo se trata de un exceso whitespaceen el principio o el final de la cadena se puede utilizar trim(), ltrim()o rtrim()para eliminarlo.

  2. Si está tratando con espacios adicionales dentro de una cadena, considere un preg_replacemúltiplo whitespaces " "*con un solo whitespace " ".

Ejemplo:

$foo = preg_replace('/\s+/', ' ', $foo);
jW.
fuente
62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio
usando el $foo = preg_replace( '/\s+/', ' ', $foo );matará los efectos denl2br()
Waiyl Karim
1
simplemente use nl2br antes de usar preg_replace y debería estar listo para comenzar.
Lukas Liesis
Typo / Escaper note: si el código no elimina espacios en blanco adicionales para usted, asegúrese de tener "\" antes de "s" :) algunas páginas de prueba de php en línea lo eliminan :)
jave.web
Esto debería ser CSS seguro, ¿verdad? Como en, ¿esto comprimiría con seguridad una variable que contenga una cadena CSS larga y de varias líneas?
David
50
$str = str_replace(' ','',$str);

O bien, reemplace con guión bajo, & nbsp; etcétera etcétera.

Cory Dee
fuente
77
Esto elimina todo el espacio en blanco. Solo quiere normalizar la cuerda.
Svend
12
Lo que estaba buscando (aunque no era la pregunta)
Sevenearths
@Gigala "¿Cuál sería la mejor manera de eliminar los espacios en blanco internos?" fue la pregunta Esta respuesta lo satisface perfectamente.
Cory Dee
1
@CoryDee Eso es cierto, para esa última oración. Pero en la introducción, la pregunta se formula como " espacio en blanco en exceso ", con énfasis en el exceso. Terminaste satisfaciendo el problema REAL del OP, por lo que no importa mucho, pero mientras nos pongamos técnicos al respecto ...
Spencer Ruskin
Esto no funciona si el recuento de espacios es número par , Diga ahora: Hi Earthcon 4 espacios en el medio se convertirá en: HiEarth. Esto no resuelve mi problema con relevante a la pregunta.
JJ Labajo
26

$str = trim(preg_replace('/\s+/',' ', $str));

La línea de código anterior eliminará espacios adicionales , así como espacios iniciales y finales.

d -_- b
fuente
25

ninguno de los otros ejemplos me funcionó, así que he usado este:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

esto reemplaza todas las pestañas, nuevas líneas, espacios dobles, etc. a 1 espacio simple.

Lukas Liesis
fuente
Gracias, @ wp78de pero por alguna razón, tuve problemas con solo \s+. Aunque fue en 2014, tal vez haya cambiado, no he tocado PHP en los últimos 3 años, no puedo comentar pero dejará la respuesta actual mientras era una solución y aún puede serlo en algunos casos.
Lukas Liesis
9

Si desea reemplazar solo múltiples espacios en una cadena, por ejemplo: "this string have lots of space . " Y espera que la respuesta sea "this string have lots of space", puede usar la siguiente solución:

$strng = "this string                        have lots of                        space  .   ";

$strng = trim(preg_replace('/\s+/',' ', $strng));

echo $strng;
Apsar
fuente
5

Existen fallas de seguridad al usar preg_replace (), si obtiene la carga útil de la entrada del usuario [u otras fuentes no confiables]. PHP ejecuta la expresión regular con eval (). Si la cadena entrante no se desinfecta correctamente, su aplicación corre el riesgo de ser sometida a inyección de código .

En mi propia aplicación, en lugar de molestarme en desinfectar la entrada (y como solo trato con cadenas cortas), en su lugar hice una función un poco más intensiva en el procesador, aunque es segura, ya que no evalúa () nada.

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}
Fom
fuente
Solo lo ejecuta utilizando eval si especifica el modificador 'e': php.net/manual/en/… y también dice que "Esta característica fue DEPRECADA en PHP 5.5.0, y ELIMINADA a partir de PHP 7.0.0. " Entonces ya no puedes evaluar cosas en preg_replace.
ADJenks
4
$str = preg_replace('/[\s]+/', ' ', $str);
Sandip Layek
fuente
2

Puedes usar:

$str = trim(str_replace("  ", " ", $str));

Esto elimina espacios en blanco adicionales de ambos lados de la cadena y convierte dos espacios en uno dentro de la cadena. ¡Tenga en cuenta que esto no convertirá tres o más espacios seguidos en uno! ¡Otra forma en que puedo sugerir es usar implosionar y explotar, que es más seguro pero totalmente no óptimo!

$str = implode(" ", array_filter(explode(" ", $str)));

Mi sugerencia es usar un bucle for nativo o usar expresiones regulares para hacer este tipo de trabajo.

Amir Fo
fuente
Esto no convierte múltiples espacios correctamente donde el espacio es más largo que dos espacios.
mikeybeck
1

Para ampliar la respuesta de Sandip, aparecía un montón de cadenas en los registros que estaban mal codificados en bit.ly. Querían codificar solo la URL, pero colocar un identificador de Twitter y algunas otras cosas después de un espacio. Se veía así

? productID =26%20via%20@LFS

Normalmente, eso no sería un problema, pero estoy recibiendo muchos intentos de inyección de SQL, así que redirijo cualquier cosa que no sea una ID válida a un 404. Utilicé el método preg_replace para convertir la cadena inválida productID en un ID de producto válido.

$productID=preg_replace('/[\s]+.*/','',$productID);

Busco un espacio en la URL y luego elimino todo después.

JScarry
fuente
0

Recientemente escribí una función simple que elimina el exceso de espacio en blanco de la cadena sin expresión regular implode(' ', array_filter(explode(' ', $str))).

Zsolt Oroszlány
fuente
-1
$str = "I      am a PHP   Developer";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
   if (isset($str_arr[$i + 1])  && $str_arr[$i] == ' ' && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
   } 
   else {
     continue;
   }
}
echo implode("", $str_arr);
Shahbaz Khan
fuente