Eliminar saltos de línea entre las tags html

Estoy haciendo un formulario (html & php) que es parte de una sección de administrador utilizada para editar contenido para un sitio web. Quiero permitir a los usuarios incluir algunos html básicos. Esto funciona bien Quiero retener saltos de línea. Esto también funciona Mi problema es que cuando alguien escribe algo como esto:

  • item one
  • item two

los saltos de línea entre las líneas de código se retienen y se convierten en BR cuando se escriben. Esto significa que hay espacio doble entre cada elemento LI. Ahora esto se puede solucionar escribiendo toda la sección de la lista en una línea, pero a) que hace que leer sea confuso yb) sea suficientemente difícil enseñar a las personas a usar los códigos y mucho menos explicar los saltos de línea extraños.

Lo que quiero es una forma de quitar todo / n pero SOLAMENTE entre las tags UL y / UL.

Esta expresión regular elimina todos los saltos de línea / espacios en blanco entre

    y que no son parte del texto entre

  • y

     /(?< =
      |< \/li>)\s*?(?=< \/ul>|
    • )/is

    Ejemplo de php:

      $output = preg_replace('/(?< =
      |< \/li>)\s*?(?=< \/ul>|
    • )/is', '', $input);

    entrada:

     
    • item one
    • item two

    salida:

     
    • item one
    • item two

    EDITAR: arreglado

    Es posible que pueda salirse con la suya usando una expresión regular, aunque esto fallará si el HTML no está bien formado. Esto debería coincidir con todo dentro de las tags HTML, porque la expresión regular es codiciosa de forma predeterminada.

     < ?php $str = "Hello 
    • item one
    • item two
    • "; $str = preg_replace_callback('~\< [^>]+\>.*\]+\>~ms','stripNewLines', $str); function stripNewLines($match) { return str_replace(array("\r", "\n"), '', $match[0]); } echo nl2br($str);

    Editar

    En realidad, esto no funcionará. Si hay dos bloques de HTML con texto normal entre ellos, también se eliminará el texto en el medio.

    Tengo problemas para entender por qué los saltos de línea se están convirtiendo en
    .

    ¿Qué está haciendo eso? ¿Es el PHP?

    ¿HTML no trata un salto de línea igual que un espacio? Convertirlos en
    no parece correcto.

    Este es un ejemplo para reemplazar los saltos de línea en la etiqueta html:

     public function testLineBreaks() { $html = 'some title'; $pattern = "#\s]+))?)+\s*|\s*)/?>#"; $html = preg_replace_callback( $pattern, function($match){ $txt = str_replace(array("\r", "\n"), ' ', $match[0]); return preg_replace("/[[:blank:]]+/"," ",$txt); },$html ); $this->assertEquals('some title', $html); }