¿Cómo eliminar saltos de línea (sin caracteres!) De la cadena?

146

Esto puede parecer un engaño, pero tenga la seguridad de que no lo es: he buscado en SO y en el resto de la web una respuesta a mi problema y terminé encontrando las mismas "soluciones" insuficientes una y otra vez. De todos modos, aquí va:

Estoy guardando la entrada del usuario de un área de texto a una base de datos MySQL (dentro de un entorno de WordPress, pero eso no debería importar a este problema, creo). Más tarde se recupera de la base de datos para mostrarse a los administradores en el back-end del sitio. El problema ocurre cuando los usuarios envían texto con saltos de línea (es decir, presionan la tecla Intro).

Una cadena de muestra podría verse así:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

No hay caracteres de final de línea ("\ n", "\ r" o similares) en la cadena.

Lo estoy usando nl2br()para generar salida HTML, pero eso no es suficiente. El resultado entonces es:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

¿Cuál, hasta donde yo entiendo, es el nl2br()resultado esperado , ya que eso inserta las etiquetas y no se supone que reemplace los saltos de línea en primer lugar?

Sin embargo, el formato que necesito sería este:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

Si la cadena tenía caracteres EOL como "\ n", la golpearía con o str_replace()o preg_replace()y terminaría, pero no tengo idea de qué aguja alimentar cualquiera de esas funciones si no hay caracteres allí en primer lugar.

Puedo acceder manualmente al campo relevante en la base de datos, presionar Retroceso para cada salto de línea y lo que más adelante quiero hacer con la cadena funciona. Entonces sé que necesito el formato anterior.

Johannes Pille
fuente
Si la cadena se parece a su primer ejemplo, ¿cómo puede decir que no tiene caracteres de salto de línea? Tiene al menos dos: dos seguidos después de "¡gracias!"
Ernest Friedman-Hill
Fair enuff @ ErnestFriedman-Hill, obviamente tienes razón: hay "algo" allí, simplemente no es visible ni nada que yo sepa.
Johannes Pille
Tampoco puedo ver cómo es posible tener nuevas líneas sin caracteres de salto de línea. Se puede usar un editor hexadecimal para inspeccionar la cadena - Estoy seguro de que encontrará los caracteres para nuevas líneas ...
ortiga

Respuestas:

376

Debería poder reemplazarlo con un preg que elimine todas las líneas nuevas y los retornos de carro. El codigo es:

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

Aunque los \ncaracteres no aparecen, si obtiene retornos de carro, hay un carácter invisible allí. El preg reemplazar debería agarrarlos y arreglarlos.

Ben Roux
fuente
Increíble. Podría haber jurado haber intentado todo de acuerdo con las respuestas tuyas y @bsdnoobz, que hacen el trabajo. Bueno, sea cual sea el bloqueo mental que tuve allí, los dos me ahorraron toneladas de tiempo. Resultó ser una pregunta bastante tonta, supongo. ¡Gracias chicos!
Johannes Pille
3
Tenga en cuenta que esto no coincidirá con todos los saltos de línea, es decir, aquellos creados en sistemas Windows. Para atraparlos, puede usar el siguiente RegEx en su lugar/\r|\n|\r\n/
Toastrackenigma
66
use \ R (que representa cualquier secuencia de final de línea) stackoverflow.com/a/16274784/1491212
Armel Larcier
435

La solución de Ben es aceptable, pero str_replace () es mucho más rápido que preg_replace ()

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

Usando menos potencia de CPU, reduce las emisiones mundiales de dióxido de carbono.

Demis Palma ツ
fuente
55
No puedo creer que esta respuesta no tenga más credibilidad. 100 aprobado para esto sobre preg_replace ()
pimbrouwers
62
IMPORTANTE: Use COTIZACIONES DOBLES alrededor de los códigos de retorno de carro y nueva línea. ¡Estos no se procesarán correctamente si usa comillas simples!
bwright
47
Pulgares arriba -> "Usar menos potencia de CPU, reduce las emisiones mundiales de dióxido de carbono".
Ene
3
@Joeri: Ese último nunca será llamado ya que sería manejado por los dos primeros. Es código redundante.
nightfox89
44
@Joeri Teniendo en cuenta que str_replace elimina todas las ocurrencias, ¿no se eliminarían \ r y \ n ambos de todos modos?
Bram Vanroy
16
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line
fluir libremente
fuente
11

Es porque nl2br()no elimina líneas nuevas en absoluto.

Devuelve cadena con <br />o <br> insertados antes de cada nueva línea ( \r\n, \n\r, \ny \r).

Use en su str_replacelugar:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
kenorb
fuente
7

También puedes usar PHP trim

Esta función devuelve una cadena con espacios en blanco eliminados desde el principio y el final de str. Sin el segundo parámetro, trim () eliminará estos caracteres:

  • "" (ASCII 32 (0x20)), un espacio ordinario.
  • "\ t" (ASCII 9 (0x09)), una pestaña.
  • "\ n" (ASCII 10 (0x0A)), una nueva línea (avance de línea).
  • "\ r" (ASCII 13 (0x0D)), un retorno de carro.
  • "\ 0" (ASCII 0 (0x00)), el byte NUL.
  • "\ x0B" (ASCII 11 (0x0B)), una pestaña vertical.
Gijs de Jong
fuente
3
Esto solo apuntará a las nuevas líneas al principio y al final de la cadena. Las líneas nuevas en el medio de la cadena no se tocarán.
mickmackusa
6

Para funcionar correctamente también en Windows, sugiero usar

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

"\r\n"- para Windows, "\r"- para Mac y "\n"- para Linux

Ajjaah
fuente
2
Lo siento amigo, pero incluso después de haber preguntado en el '12, puedo decirle con absoluta certeza que esto es redundante. Pregúntese lo siguiente: si todo \ry \nse eliminan en la cadena, ¿por qué ese no sería el caso para aquellos que se siguen directamente?
Johannes Pille
Realmente, esto obvio no me vino a la mente ... Gracias :) Me acabo de dar cuenta de que he tenido problemas con él, pero fue al revés, lo usé \r\nen Windows y no funcionó en Linux.
Ajjaah
Bueno, estoy usando esta función para reemplazar saltos de línea con comas, por lo que una dirección es un texto de una sola línea, por lo que reemplazar \r\nFIRST ayudaría, ya que eso significa una coma en lugar de dos para cada parte si ese salto de línea
Martin
@ Martin Sí, tienes razón, me di cuenta de lo mismo, así que reemplazamos \r\nprimero, luego reemplazamos \ry \n, he editado mi respuesta.
Ajjaah
Esto sigue siendo redundante, si va a eliminar todo \ry \r, no es necesario eliminarlo \r\n, puede str_replace(array("\r","\n"), "", $buffer);obtener el mismo resultado.
stramin
6

str_replace (PHP_EOL, nulo, $ str);

Rafanake
fuente
1
mientras que esto puede responder la pregunta. Se recomienda explicar un poco sobre su respuesta.
Anirudh Sharma
PHP_EOL no siempre funciona cuando lees una cadena. Lo hace cuando los escribes.
nightfox89
Las respuestas de solo código tienen poco valor en StackOverflow porque hacen muy poco para educar al OP y a los futuros lectores.
mickmackusa
4

Algo un poco más funcional (fácil de usar en cualquier lugar):

function strip_carriage_returns($string)
{
    return str_replace(array("\n\r", "\n", "\r"), '', $string);
}

¡Usar PHP_EOL como parámetro de reemplazo de búsqueda también es una buena idea! Prestigio.

tfont
fuente
1

Alternativa incorporada: trim ()

trim  Strip whitespace (or other characters) from the beginning and end of a string
Description 
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

Está ahí para eliminar saltos de línea de diferentes tipos de archivos de texto, pero no maneja html.

NVRM
fuente
0

Utilizo 3 líneas para hacer este trabajo, así que considera $ s como tu "material" ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
PYK
fuente