php: reemplazar el doble con

utilizo nicEdit para escribir datos RTF en mi CMS. El problema es que genera cadenas como esta:

hello first line

this is a second line
this is a 3rd line

ya que esto es para un sitio de noticias, prefiero que el html final sea así:

 

hello first line

this is a second line
this is a 3rd line

entonces mi solución actual es esta:

  1. necesito recortar los $ datos para
    al comienzo / final de la cadena
  2. reemplace todas las cadenas que tienen 2
    o más con

    (se permite una sola
    ).

  3. finalmente, agregue

    al inicio y

    al final

solo tengo los pasos 1 y 3 hasta el momento. ¿alguien puede ayudarme con el paso 2?

 function replace_br($data) { # step 1 $data = trim($data,'

'); $data = trim($data,'

'); $data = trim($data,'
'); # step 2 ??? // preg_replace() ? # step 3 $data = '

'.$data.'

'; return $data; }

¡Gracias!

pd: sería incluso mejor evitar situaciones específicas. ejemplo: ” hello

too much space “: esas 5 líneas de corte también deberían convertirse en solo una ”

solución final (¡gracias especiales a kemp!)

 function sanitize_content($data) { $data = strip_tags($data,'

,
,,,,,,

,
    ,
      ,
    • ,'); $data = trim($data,'

      '); $data = trim($data,'

      '); $data = trim($data,'
      '); $data = preg_replace('#(?:
      \s*?){2,}#','

      ',$data); $data = '

      '.$data.'

      '; return $data; }

Esto funcionará incluso si las dos líneas están en líneas diferentes (es decir, hay una nueva línea o cualquier espacio en blanco entre ellas):

 function replace_br($data) { $data = preg_replace('#(?:\s*?){2,}#', '

', $data); return "

$data

"; }

Este enfoque resolverá su problema:

  1. Divida la cadena en
    o
    : obtendrá una serie de cadenas.
  2. Crea una nueva cadena

    .

  3. Haga un ciclo en la matriz de 1, desde el principio hasta el final y elimine todas las entradas que estén vacías, hasta que una entrada no esté vacía (corte).
  4. Igual que 3, pero desde el final hasta el comienzo de la matriz.
  5. Loop en la matriz de 1, tiene un valor entero A (predeterminado 0), que establece que hay una ruptura simple o doble.
    1. Si la cadena está vacía, aumente el valor de A y continúe el ciclo.
    2. Si la cadena no está vacía:
      1. Si el valor de A es 1 o menos, agregue un
        .
      2. Si el valor de A es 2 o superior, agregue un

        .

    3. Adjunte el contenido de la entrada actual (que no está vacía).
    4. Establezca el valor de A en 0.
  6. Añadir

Un enfoque diferente: usar expresiones regulares

 (
){2,}

Coincidirá con 2 o más
. (Ver php.net en preg_split sobre cómo hacer esto).

Ahora, el mismo enfoque en los pasos 2 y 3: bucle en la matriz dos veces, una vez desde el comienzo hasta (0..length) y una vez desde el final hacia abajo (longitud-1..0). Si la entrada está vacía, quítela del conjunto. Si la entrada no está vacía, salga del ciclo.

Para hacer esto:

 $array = preg_split('/(
\s*){2,}/i', $string); foreach($i = 0; $i < count($array); $i++) { if($value == "") { unset($array[$i]); }else{ break; } } foreach($i = count($array) - 1; $i >= 0; $i--) { if($value == "") { unset($array[$i]); }else{ break; } } $newString = '

' . implode($array, '

') . '

';

Creo que esto debería funcionar para el paso # 2 a menos que no entienda completamente tu escenario:

 $string = str_replace( '

', '

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

', '

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

', '

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

', '

', $string );