2009-05-03 17 views
11

Estoy desarrollando un single serving site en PHP que simplemente muestra los mensajes publicados por los visitantes (lo ideal es que rodeen el tema del sitio web). Cualquiera puede publicar hasta tres mensajes por hora.Eliminando saltos de línea redundantes con expresiones regulares

Como el sitio web solo tendrá una página, me gustaría controlar la longitud vertical de cada mensaje. Sin embargo, sí quiero preservar al menos parcialmente los saltos de línea en el mensaje original. Un compromiso sería permitir dos saltos de línea, pero si hay más de dos, reemplazarlos con un total de dos saltos de línea en una fila. Stack Overflow implementa esto.

Por ejemplo:

"Porcupines \ nare \ n \ n \ n \ nporcupiney."

sería cambiado a

"puercoespines < br /> son < br /> < br /> porcupiney."

Un aspecto complicado de comprobar si hay saltos de línea es la posibilidad de que se recopilen y almacenen como \ r \ n, \ r, o \ n. Pensé en convertir todos los saltos de línea en < br /> s usando nl2br(), pero eso parecía innecesario.

Mi pregunta: Usando expresiones regulares en PHP (con funciones como preg_match() y preg_replace()), ¿cómo puedo verificar instancias de más de dos líneas seguidas (con o sin espacio en blanco entre ellas) y luego cámbielos a un total de dos saltos de línea?

Respuesta

30
preg_replace('/(?:(?:\r\n|\r|\n)\s*){2}/s', "\n\n", $text) 
+0

¡Gracias, caos! Eso funciona exactamente como se desea. Tu respuesta original funcionó también. – tevan

+0

La respuesta original no cumplió con su criterio 'con o sin espacio en blanco'. :) – chaos

+0

Pero cuando solo hay un salto de línea, ¿lo cambia a dos? ¿No debería dejar un solo descanso como está? – NonCoder

6

Algo así como

preg_replace('/(\r|\n|\r\n){2,}/', '<br/><br/>', $text); 

debería funcionar, creo. Aunque no recuerdo exactamente la sintaxis de PHP, podría necesitar un poco más de escape: -/

+0

Gracias David. El único problema que veo con la expresión regular que publicaste es que no admite espacios entre saltos de línea. – tevan

+0

Ah, es cierto ... Me perdí la parte de su pregunta donde mencionó espacios entre saltos de línea. –

Cuestiones relacionadas