Удаление разрывов строк из html-тегов

Я делаю форму (html и php), которая является частью раздела администратора, используемого для редактирования контента для веб-сайта. Я хочу разрешить пользователям включать некоторые базовые html. Это прекрасно работает. Я хочу сохранить разрывы строк. Это также работает. Моя проблема в том, что когда кто-то пишет что-то вроде этого:

<ul> <li>item one</li> <li>item two</li> </ul> 

линия разрывается между строками кода, сохраняется и преобразуется в BR при выписывании. Это означает, что между каждым элементом LI существует двойной интервал. Теперь это можно исправить, написав весь раздел списка на одной строке, но а), что делает его запутанным для чтения, и б) он достаточно усерден, чтобы обучать людей использованию кодов, не говоря уже об объяснении лишних разрывов строк.

То, что я хочу, – это какой-то способ удалить все / n, но ТОЛЬКО между тегами UL и / UL.

Это регулярное выражение удаляет все строки / пробелы между <ul> и </ul> , которые не являются частью текста между <li> и </li>

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

Пример php:

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

вход:

 <ul> <li>item one</li> <li>item two</li> </ul> 

вывод:

 <ul><li>item one</li><li>item two</li></ul> 

EDIT: исправлено

Возможно, вам удастся избежать использования регулярного выражения, хотя это не удастся, если HTML не сформирован правильно. Это должно соответствовать всем тегам HTML, потому что по умолчанию регулярное выражение является жадным.

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

редактировать

Собственно, это не сработает. Если между блоками есть два блока HTML с обычным текстом, текст в середине также будет удален.

У меня возникли проблемы с пониманием того, почему разрывы строк превращаются в <BR>.

Что это значит? Это PHP?

Не обрабатывает ли HTML разрыв строки так же, как пробел? Включение их в <BR> не кажется правильным.

Это пример замены разрывов строк в теге html:

 public function testLineBreaks() { $html = '<span class="text" >some title</span>'; $pattern = "#</?\w+((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\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('<span class="text" >some title</span>', $html); }