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 ";
James
fuente
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));
jwueller
fuente
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));
matsolof
fuente
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

NullUserException
fuente
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);
fabrik
fuente
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);
RobertPitt
fuente
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);
Peter
fuente
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 ''.

n00dle
fuente
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);
netom
fuente
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
fuente
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);
MD Al Amin Bhuiyan
fuente
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 ...

GDY
fuente
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.

ekerner
fuente
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);
Rajeev
fuente
2

tal vez esto funciona:

$str='\n';
echo str_replace('\n','',$str);
زياد
fuente
1

Este también elimina pestañas

$string = preg_replace('~[\r\n\t]+~', '', $text);
usuario3213174
fuente
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 );
PCMShaper
fuente
1

Muchas de estas soluciones no funcionaron para mí. Esto hizo el truco sin embargo:

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

Aquí está la referencia: - PCRE y nuevas líneas

Adam Whateverson
fuente
0

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

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

fuente
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;
Ramesh
fuente