Pregunta

He repasado otras preguntas de desbordamiento de pila con ideas similares, pero ninguno parece ser muy similar a lo suficiente de lo que estoy tratando de hacer.

Parece sencillo, pero estoy en un aprieto. Estoy tratando de reemplazar múltiples ocurrencias de un salto de línea (\n) con sólo un salto de línea, por lo que la gente no será capaz de presentar ruptura más de una línea a la vez. Esto es lo que he intentado.

$text = "Foo\n\n\nbar!\n\nfoobar!";
$text = preg_replace("#\n+#", "\n", $text);
echo $text;

La sentencia ha devuelto esperado sería:

Foo\nbar!\nfoobar!

Pero no puro! Probé varios pero ninguno parecía funcionar.

¿Qué estoy haciendo mal?

Gracias!

¿Fue útil?

Solución 3

Si está interesado sólo en la solución, pase a la última línea.

Esto es lo que terminó sucediendo. Tenía una etiqueta div en HTML que contiene cierta información. Cuando un usuario pulsa un botón, se ejecuta un código JS que convierte div que a un cuadro de texto input, y establece el valor de ese cuadro de texto como el html de la div originales - al sustituir todas las apariciones de <br> con \n para crear saltos de línea reales. La forma luego se envía a través del Ajax al servidor.

Cuando traté de reemplazar los saltos de línea en PHP, ninguna de las sugerencias anteriores ayudó, por la sencilla razón de que no era (curiosamente) un carácter salto de línea "real". Lo consiguió envía al servidor fue el \n literal. Uno pensaría que escapar de la barra invertida en \n, según lo sugerido por ghostdog74 resolvería el problema, pero no lo hizo. He intentado escapar varias maneras diferentes, pero nada parecía ayudar.

terminé hace referencia a algún material de expresiones regulares de edad y encontró que:

  

Muchos sabores también apoyan la secuencia de E \ Q ... \ escape. Todos los caracteres entre el \ Q y el \ E se interpretan como caracteres literales. P.ej. \ Q * \ d + * \ E coincide con el texto literal \ d + . El \ E se puede omitir al final de la expresión regular ... Esta sintaxis es soportado por el motor JGsoft, Perl, PCRE ... [fuente]

Después de eso, aquí está la pieza de código que resolvió mi problema:

$text = preg_replace('#[\Q\n\E]+#', "\n", $text);

Gracias a todos por su ayuda! 1 para todos:)

Otros consejos

Es posible que también desee comprobar para las tres variedades de saltos de línea:

$text = "Foo\n\r\n\n\rbar!\n\nfoobar!";
$text = preg_replace('#(\r\n|\r|\n)+#m', "\n", $text);
echo $text;
$text = "Foo\n\n\nbar!\n\nfoobar!";
$s = split("\n+",$text);
print_r( implode("\n",$s)); #this will join the string with newline
print_r( implode("\\n",$s)); # this will have literal \n in your string 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top