2009-04-08 8 views
5

Estoy buscando algo como trim() pero dentro de los límites de una cadena. Los usuarios a veces ponen 2, 3, 4 o más retornos de línea después de que escriben, necesito desinfectar esta entrada.Eliminar retornos de línea excesivos

entrada de la muestra

i like cats 


my cat is happy 
i love my cat 



hope you have a nice day 

salida deseada

i like cats 

my cat is happy 
i love my cat 

hope you have a nice day 

no estoy viendo nada incorporada, y una cadena de reemplazo llevaría muchas iteraciones de la misma para hacer el trabajo. Antes de encender una pequeña cadena recursiva, quería ver qué otras sugerencias tenían.

Tengo la extraña sensación de que también hay una expresión regular para esta.

Respuesta

3

finalmente logró conseguirlo, por lo que las necesidades de preg está utilizando la versión de PCRE en php, y también necesita una cadena de reemplazo \ n \ n, con el fin de no borrar todos los finales de línea, pero uno:.

$body = preg_replace("/\n\n+/", "\n\n", $body); 

Gracias por sacarme en el camino correcto

+0

Quizás deba seleccionar la respuesta aceptada (tharkun) para que esta pregunta se marque como respondida (y sacada de la cola no respondida). – Calvin

3

¿Cuánto texto necesita para hacer esto? Si es menos de aproximadamente 100 k, entonces podría probablemente sólo tiene que utilizar una simple búsqueda y reemplazo de expresiones regulares (buscando algo así como /\n+/ y reemplazar con \n)

Por otro lado, si usted tiene que ir a través de megabytes de datos, entonces se podría analizar el carácter carácter por carácter, copiando la entrada en la salida, excepto cuando se encuentran líneas nuevas, en cuyo caso simplemente copiará una nueva línea e ignorará el resto.

No recomendaría un reemplazo de cadena recursivo aunque, suena como que sería muy, muy lento.

+0

No mucho, un correo electrónico que vale la pena para un usuario que envía un correo electrónico, es parte de un sistema web. –

10
function str_squeeze($body) { 
    return preg_replace("/\n\n+/", "\n\n", $body); 
} 
+0

Esto devuelve todas las líneas separadas por una \ n, después de que cambie a "en" en las args. –

+0

Una (ligeramente) más fluida regex se vería así: preg_replace ("/ \ n {2,} /", "\ n \ n ", $ body); – KOGI

+0

gracias KOGI. simplificado, bueno, es un poco más de código. ¿Es más rápido? – markus

2

La siguiente expresión regular debe quitar varios saltos de línea sin tener en cuenta los saltos de línea individuales, que son bien por su definición:

ereg_replace("\n\n+", "\n\n", $string); 

puede probarlo con este PHP Regular Expression test tool, que es muy práctico (pero como parece que no está en perfecta paridad con PHP).

[EDIT] Se ha corregido el "para", ya que no parecen funcionar tiene que admitir que acabo de probar la expresión regular en la herramienta web;..)

+0

No obtuve ningún resultado hasta que cambié el 'a a' en la expresión y lo reemplazo. Entonces funciona, pero mata \ n \ n –

+0

Esa expresión regex no está en paridad perfecta con php. Seguiré buscando una solución. –

3

Para tener en cuenta las tres secuencias de salto de línea:

preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $str) 
+0

Gracias, ejecuto una línea que termina unificador antes de ejecutar preg_replace ("/ \ n \ n + /", "\ n \ n", $ body); –

Cuestiones relacionadas