Eliminar múltiples espacios en blanco

208

Estoy obteniendo $row['message']de una base de datos MySQL y necesito eliminar todos los espacios en blanco como, \n \tetc.

$row['message'] = "This is   a Text \n and so on \t     Text text.";

debe formatearse para:

$row['message'] = 'This is a Text and so on Text text.';

Lo intenté:

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

pero no elimina \no \t, solo espacios individuales. ¿Puede alguien decirme cómo hacer eso?

creativz
fuente
1
Los caracteres de nueva línea y tabulación están entre comillas simples, ¿entonces los quiere literal?
Mark Lalor el
Arreglé la cita del código sectin con \ n y \ t cambiándola a comillas dobles.
Buttle Butkus

Respuestas:

394

Necesitas:

$ro = preg_replace('/\s+/', ' ',$row['message']);

Está utilizando lo \s\s+que significa espacio en blanco (espacio, tabulación o nueva línea) seguido de uno o más espacios en blanco. Lo que efectivamente significa reemplazar dos o más espacios en blanco con un solo espacio.

Lo que desea es reemplazar uno o más espacios en blanco con un solo espacio en blanco, para que pueda usar el patrón \s\s*o \s+(recomendado)

codictorio
fuente
1
su método es mejor que esto: ¿por qué reemplazarías un espacio con un espacio?
nickf
16
También quiere que \ ny \ t sean reemplazados por espacio. Ahora su patrón no coincide con estos, digamos por $ x = "does \ nthis \ twork"; El OP quiere que todos los espacios en blanco sean reemplazados por un solo espacio.
codaddict
@codaddict, ¿cómo podemos mantener \ n y eliminar todos los demás espacios múltiples y pestañas de la cadena? por favor ayúdame
Mansoorkhan Cherupuzha
¿Puede ser más específico por qué se recomienda "\ s +"?
Isius
66
Tenga en cuenta que en PHP \sno incluye "pestaña vertical" chr(11). Para incluirlo también debe usar la spaceclase de caracteres: [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav
68
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

Esto salidas

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present
Cez
fuente
3
Eres un verdadero salvavidas. Estaba a punto de saltar si la ventana sobre esto.
bikey77
Aseado, todavía útil
spekulatius
16
preg_replace('/[\s]+/mu', ' ', $var);

\s ya contiene pestañas y nuevas líneas, por lo que esta expresión regular anterior parece ser suficiente.

Anónimo
fuente
2
Aquí no se necesitan corchetes porque solo hay una cosa dentro de ellos. El /mno tendrá un efecto ya que no existen ^o $anclas y el /uno tendrá ningún efecto, salvo para retardar ligeramente hacia abajo y morir si la cadena de entrada no es válida UTF-8 (que no afecta a lo que \scoincide, pero que afectaría \pZ)
thomasrutter
12

simplificado a una función:

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

basado en la respuesta de Danuel O'Neal.

Lukas Liesis
fuente
7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
ghostdog74
fuente
2
Este es el que mejor me funcionó. Además, agregaría recortar para borrar espacios en blanco al principio y al final de la cadena
Dziamid
@Dziamid Puedes hacerlo con trim (preg_replace (...))
Balázs Varga
7

No puedo replicar el problema aquí:

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

No estoy seguro de si fue solo un error de transcripción o no, pero en su ejemplo, está utilizando una cadena entre comillas simples. \ny \tsolo se tratan como nueva línea y pestaña si tiene una cadena entre comillas dobles. Es decir:

'\n\t' != "\n\t"

Editar : como señaló Codaddict, \s\s+no reemplazará un solo carácter de pestaña. Sin embargo, todavía no creo que usar \s+sea ​​una solución eficiente, así que, ¿qué tal esto en su lugar?

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
nickf
fuente
2
+1, cierto. Para una cadena con muchos espacios individuales (que generalmente es el caso) es ineficiente reemplazar un espacio con espacio.
codaddict
1
@coaddict: para probar su hipótesis, escribí un script rápido para ejecutar 1000 de cada reemplazo y verificar el momento de cada uno. Para la cadena '+1, True. Para una cadena con muchos espacios individuales (que generalmente es el caso) es ineficiente reemplazar un espacio con espacio. - codaddict 24 de febrero \ '10 a las 13:32 ' , mil \ s + preg_replace () llamadas tomaron 0.010547876358032 segundos, y mil (?: \ S \ s + | \ n | \ t) preg_replace () llamadas tomaron 0.013049125671387, haciendo Es casi un 30% más lento.
Joseph Cheek
Es posible que desee añadir "\ r" a ese último ejemplo que algunos equipos utilizan un único "\ r" por su propia cuenta (Apple Mac?)
thomasrutter
4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

Esto reemplaza todas las pestañas, todas las líneas nuevas y todas las combinaciones de múltiples espacios, pestañas y líneas nuevas con un solo espacio.

Middus
fuente
4
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);
Danuel O'Neal
fuente
¿Por qué motivo la función estática remove_whitespace es? Usted define pero nunca lo usa.
Lukas Liesis
Cada uno tiene su uso, pero ninguno de ellos lograría lo que la pregunta pide: reemplazar múltiples espacios en blanco consecutivos con solo uno. Su "remove_doublewhitespace" solo reemplazaría múltiples del mismo carácter de espacio en blanco, por lo que reemplazaría "\ n \ n \ n" con un '', pero no haría nada para "\ r \ n"
thomasrutter
4

Sin preg_replace ()

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;
Hharek
fuente
2

Yo uso este código y patrón:

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

Puede probar esto en http://writecodeonline.com/php/

Catalin T.
fuente
Funciona conmigo incluso en mariaDB en esta consulta: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 así que muchas gracias
jalmatari
1

Todo lo que necesitas es ejecutarlo de la siguiente manera:

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.
Alex Polo
fuente
1

Esto es lo que usaría:

a. Asegúrese de usar comillas dobles, por ejemplo:

$row['message'] = "This is   a Text \n and so on \t     Text text.";

si. Para eliminar espacios en blanco adicionales, use:

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

Puede que no sea la solución más rápida, pero creo que requerirá el menor código y debería funcionar. Sin embargo, nunca he usado mysql, así que puedo estar equivocado.

matsolof
fuente
1

En verdad, si crees que quieres algo como esto:

preg_replace('/\n+|\t+|\s+/',' ',$string);
BigBlast
fuente
1

esto reemplazará varias pestañas con una sola pestaña

preg_replace("/\s{2,}/", "\t", $string);
Heman G
fuente
-2

Sin preg_replace, con la ayuda de loop.

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$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