Eliminar nuevas líneas de la cadena y reemplazar con un espacio vacío


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Quiere eliminar todas las líneas nuevas de la cadena.

Tengo esta expresión regular, puede atraparlos a todos, el problema es que no sé con qué función debería usarla.

/\r\n|\r|\n/

$string debe convertirse:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

1
Si está haciendo miles de reemplazos, evite usar preg_replace. Es casi el doble de lento que str_replace.
Alex W

Puede ser s($str)->normalizeLineEndings('')útil, como se encuentra en esta biblioteca independiente . Eliminará no solo LF, CR y CRLF, sino también cualquier nueva línea Unicode.
graznar

Respuestas:


578

Debe tener cuidado con los saltos de línea doble, lo que causaría espacios dobles. Use esta expresión regular realmente eficiente:

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

Múltiples espacios y nuevas líneas se reemplazan con un solo espacio.

Editar: como otros han señalado, esta solución tiene problemas para hacer coincidir nuevas líneas individuales entre palabras. Esto no está presente en el ejemplo, pero uno puede ver fácilmente cómo podría ocurrir esa situación. Una alternativa es hacer lo siguiente:

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

10
Antes de usar esta solución, vea mi respuesta a continuación y los comentarios a mi respuesta. Es posible que esta solución no funcione como espera.
matsolof

1
en la expresión regular "\ s Coincide con un carácter de espacio en blanco", ¿por qué coincidiría con una nueva línea?
Michael Z

2
Estaba buscando una solución para eliminar / reemplazar todos los espacios en blanco pero no espacios (dobles). Esta es la expresión regular que lo hizo:/(?![ ])\s+/
algoritmo

Solo quería hacerle saber que su solución me ha ahorrado mucho tiempo.
Parthapratim Neog

183

Algunos comentarios sobre la respuesta aceptada:

Los +medios "1 o más". No creo que necesites repetir \s. Creo que simplemente puedes escribir '/\s+/'.

Además, si desea eliminar los espacios en blanco primero y último en la cadena, agregue trim.

Con estas modificaciones, el código sería:

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

Tienes razón; /\s\s+/no coincidiría con el salto de línea foo\nbar.
Alan Moore

79

Solo usa preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

Podría salirse con la suya str_replace(), aunque el código no se ve tan limpio:

$string = str_replace(array("\n", "\r"), '', $string);

Véalo en vivo en ideone


1
OP quiere un espacio entre "párrafos" y "para". Si solo elimina los caracteres de nueva línea, no habrá uno.
Daniel Vandersluis

por favor, corregir a que$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

De lo contrario no hay nada más que decir. esa es la respuesta más simple, creo!
erikbwork

3
@erik Entonces lo estaría "corrigiendo". Funciona bien como está.
NullUserException

1
@Vineet Es solo un delimitador que indica el inicio y el final de la expresión regular
NullUserException

21
$string = str_replace(array("\n", "\r"), ' ', $string);

3
Las secuencias de escape en PHP deben ser doblemente citadas.
Daniel Vandersluis

Sin embargo, esto no hace exactamente lo que el OP quiere, ya que es lo mismo que la respuesta evasiva y no está eliminando los \rcaracteres
NullUserException

@NullUser: ¿Por qué no actualizas tu propia publicación en lugar de comentar sobre esto?
fabrik

@NullUser: excepto el hecho de que reemplaza todo con '' en lugar de ''.
fabrik

12

Debe usar str_replace por su velocidad y usar comillas dobles con una matriz

str_replace(array("\r\n","\r"),"",$string);

Bajo en recursos, perfecto, tks.
CONvid19

1
Podría estar equivocado, pero este código no elimina la nueva línea de caracteres en los sistemas Unix porque en esos sistemas la nueva línea es justa \ny no \r\nmás, creo que el OP está pidiendo poner un solo espacio en lugar de nuevas líneas
Marco Demaio

7

No estoy seguro de si esto tiene algún valor contra las respuestas ya enviadas, pero también puedo publicarlo.

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);

6

Los reemplazos de expresiones regulares PCRE se pueden hacer usando preg_replace: http://php.net/manual/en/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

Reemplazaría una nueva línea o devolvería caracteres con un espacio. Si no desea que nada los reemplace, cambie el segundo argumento a ''.


1
Las pregfunciones usan PCRE, no POSIX, expresiones regulares. Hay eregfunciones que usan POSIX, pero ahora están en desuso.
Daniel Vandersluis

5

Utilizar este:

reemplazar series de nuevas líneas con una cadena vacía:

$string = preg_replace("/[\\n\\r]+/", "", $string);

o probablemente desee reemplazar las nuevas líneas con un solo espacio:

$string = preg_replace("/[\\n\\r]+/", " ", $string);

Por favor formatee su código correctamente. Esto se hace sangrando la línea relevante por cuatro espacios.
jwueller

2
Es por eso que uso comillas simples para no tener que escapar de esos caracteres. \\nparece terrible. \\\\ hacer coincidir una barra invertida es horrible.
NullUserException

5

La secuencia de escape\R coincide con una nueva línea genérica

es decir, cualquier cosa que Unicode considere una secuencia de salto de línea. Esto incluye todos los caracteres que coinciden con \v( espacio en blanco vertical ) y la secuencia de varios caracteres \x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

En modo de 8 bits no UTF-8 \Res equivalente a lo siguiente: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101 Demo


Anton, comprueba si mi edición está bien. Se agregó más información.
bobble bubble

4

Los saltos de línea en el texto generalmente se representan como:

\ r \ n - en una computadora con Windows

\ r - en una computadora Apple

\ n - en Linux

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);

3

De que se trata:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

Esta debería ser una solución bastante sólida porque \ n no funciona correctamente en todos los sistemas si no me equivoco ...


Esto no parece reemplazar \ r, pero solo \ n: ideone.com/28KPcb
T30

Como se menciona en el manual, PHP_EOL contiene el símbolo correcto 'Fin de línea' para la plataforma actual. Si importa cadenas de otras plataformas o simplemente tiene cadenas mal formateadas, esto puede romperse.
GDY

Si tiene un entorno bastante cerrado, esta parece ser la solución más elegante para mí porque es independiente de la plataforma y probablemente bastante eficiente ... si tiene una entrada más amplia como escenarios de importación / exportación, probablemente debería usar una solución de expresiones regulares.
GDY

3

Me sorprendió ver lo poco que todos saben sobre expresiones regulares.

Strip newlines en php es

$str = preg_replace('/\r?\n$/', ' ', $str);

En perl

$str =~ s/\r?\n$/ /g;

Lo que significa reemplazar cualquier carácter de nueva línea al final de la línea (para mayor eficiencia), opcionalmente precedido por un retorno de carro, con un espacio.

\ n o \ 015 es nueva línea. \ r o \ 012 es el retorno de carro. ? en regex significa coincidencia 1 o cero del carácter anterior. $ en expresiones regulares significa el final de la línea del partido.

La referencia original y mejor regex es perldoc perlre, cada codificador debe conocer este documento bastante bien: http://perldoc.perl.org/perlre.html Tenga en cuenta que no todas las funciones son compatibles con todos los idiomas.


Esta solución no funcionó para mí, pero como se mencionó, necesitaré leer más para producir la solución real. Me sorprendió que esto no funcionara.
Adam Whateverson el

2

este es el patrón que usaría

$string = preg_replace('@[\s]{2,}@',' ',$string);

2

tal vez esto funciona:

$str='\n';
echo str_replace('\n','',$str);

1

Este también elimina pestañas

$string = preg_replace('~[\r\n\t]+~', '', $text);

1

Puede probar el siguiente código preservará cualquier espacio en blanco y nuevas líneas en su texto.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

echo preg_replace( "/\r|\n/", "", $str );


0

este código a continuación funciona con todo el texto, úselo:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

0

Puede eliminar una nueva línea y múltiples espacios en blanco.

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.