2010-09-21 18 views
207
$string = " 
put returns between paragraphs 

for linebreak add 2 spaces at end 

"; 

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

tengo esta expresión regular, se puede coger todos ellos, el problema es que no sé con qué función debería usarlo.

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

$string debe convertirse en:

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

Si estás haciendo miles de reemplazos, evitar el uso de 'preg_replace'. Es casi dos veces más lento que 'str_replace'. –

+0

Puede encontrar ['s ($ str) -> normalizeLineEndings ('')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L540) útil , como se encuentra en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). Eliminará no solo LF, CR y CRLF, sino también cualquier nueva línea Unicode. – caw

Respuesta

417

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

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

Los espacios múltiples y las líneas nuevas se reemplazan con un espacio simple.

Editar: Como han señalado otros, esta solución tiene problemas que coinciden con líneas nuevas 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)); 
+13

+1 para la expresión regular –

+8

Antes de usar esta solución, vea mi respuesta a continuación y los comentarios a mi respuesta. Esta solución puede no funcionar como esperabas. – 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? –

55

sólo tiene que utilizar preg_replace()

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

Usted podría salirse con la str_replace() en este caso, 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á ninguno. –

+2

el primero no funciona – James

+0

por favor corrige eso a '$ string = preg_replace (" ~ [\ r \ n] ~ "," ", $ string);' – erikbwork

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

Secuencias de escape en PHP deben ser citadas. –

+0

Esto no hace exactamente lo que el OP quiere, ya que esto es lo mismo que la respuesta elusiva y no elimina los caracteres '\ r' – NullUserException

+0

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

5

PCRE reemplazos de expresiones regulares 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 nueva línea o caracteres de retorno con un espacio. Si no quiere que nada lo reemplace, cambie el segundo argumento al ''.

+1

Las funciones 'preg' usan PCRE, no expresiones POSIX, regulares. Hay funciones 'ereg' que usan POSIX, pero ahora están en desuso. –

+0

Vaya, buen punto, lo siento! Corrigiendo ahora. – n00dle

3

Utilice esta:

reemplazar serie de saltos de línea con una cadena vacía:

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

o es probable que desee reemplazar los saltos de línea con un solo espacio:

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

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, así que no necesito escapar de esos caracteres. '\\ n' se ve terrible. '\\\\' para que coincida con una sola barra invertida es simplemente horrible. – NullUserException

10

Debe utilizar str_replace por su velocidad y el uso de comillas dobles con una matriz

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

Bajo en recursos, perfecto, tks. –

1

Este es el modelo que yo usaría

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

algunos comentarios sobre la respuesta aceptada:

El + significa "1 o más". No creo que deba repetir \s. Creo que simplemente puede escribir '/\s+/'.

Además, si desea eliminar 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)); 
+0

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

+2

Es bueno tener una cofirmación en la que estoy en lo cierto. ¿Qué significan "foo" y "bar", por cierto? Sé que son marcadores de posición, pero ¿qué significan realmente las palabras? ¿Y no sería mejor utilizar palabras más familiares, que serían menos confusas para los principiantes, como marcadores de posición?Cuando vi por primera vez "foo" y "bar" en un tutorial u otro, pensé que las palabras eran un código, y me tomó un tiempo darme cuenta de que no lo son. – matsolof

+1

http://www.urbandictionary.com/define.php?term=foobar – activeDev

1

Escape sequence \R coincide con una nueva línea genérica

que es, cualquier cosa considerada como una secuencia de salto de línea por Unicode. Esto incluye todos los caracteres ajustada por \v (espacios en blanco verticales), y la secuencia de caracteres de múltiples \x0D\x0A ...

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

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

Regex101 Demo

+0

Anton, por favor, compruebe, si mi edición está bien! Se agregó más información. –

1

Ésta también elimina pestañas

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

no estoy seguro de si esto tiene algún valor en contra de las respuestas ya presentadas pero puedo igual de bien publicarlo.

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

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

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

Cuál es sobre: ​​

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

Esta debe ser una solución muy robusta porque \ n no funciona correctamente en todos los sistemas, si no me equivoco ...

0

Puede intente a continuación el 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

Me sorprendió ver lo poco que todo el mundo sabe sobre regex.

saltos de línea tira en PHP es

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

en Perl

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

Significado reemplazar cualquier carácter de nueva línea al final de la línea (para la eficiencia) - opcionalmente precedido por un retorno de carro - con una espacio.

\ n o \ 015 es nueva línea. \ r o \ 012 es el retorno de carro. ? en expresiones regulares significa emparejar 1 o cero del personaje anterior. $ en expresiones regulares significa coincidencia al final de la línea.

La referencia de expresiones regulares original y mejor es perlre perldoc, cada codificador debe saber este documento bastante bien: http://perldoc.perl.org/perlre.html en cuenta que no todas las características son compatibles con todos los idiomas.

1

tal vez esto funciona:

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