Замена одиночных разрывов строк HTML-разрывами строк, только если это разрешено в контексте

Я ищу, чтобы заменить одиночные разрывы строк (двойники уже пропали) в <br> теги, но только когда они разрешены в контексте.

Например, рассмотрим ниже:

<ul>
<li>cat</li>
<li>dog</li>
<li>fish</li>
<li>horse</li>
</ul>

<br> теги не разрешено во многих областях приведенного выше кода, но работает обычный простой код замены / добавления, такой как использование nl2br() или работает str_replace() очевидно, не будет следовать этим правилам контекста.

Для вышеперечисленного вам необходимо соблюдать следующие правила:

  • Разрывы строк ДО начало тег списка должен быть преобразованным
  • Разрывы строк ПОСЛЕ начало тег списка не должен быть преобразованным
  • Разрывы строк ДО начало тег элемента списка не должен быть преобразованным
  • Разрывы строк ПОСЛЕ начало тег элемента списка должен быть преобразованным
  • Разрывы строк ДО закрытие тег элемента списка должен быть преобразованным
  • Разрывы строк ПОСЛЕ закрытие тег элемента списка не должен быть преобразованным
  • Разрывы строк ДО закрытие тег списка не должен быть преобразованным
  • Разрывы строк ПОСЛЕ закрытие тег списка должен быть преобразованным

Существуют ли текущие функции / библиотеки, которые уже могут выполнять эту функцию? Конечно, это общая проблема, поэтому я думаю, что должно быть что-то.

0

Решение

Это было бы сложно сделать в PHP. nl2br не подходит для сохранения HTML в тексте, который вы хотите обработать, поэтому вам придется использовать синтаксический анализатор DOM для этого.

Или вы можете написать свою собственную функцию, которая перебирает весь текст. Каждый раз, когда он сталкивается с открытием < он должен сохранять флаг, который сбрасывается после >, Когда он встречает символы новой строки, он может проверить флаг, чтобы увидеть, должен ли символ быть сохранен или заменен на <br>, Таким образом, вы можете построить строку результата за символом. Обратите внимание, что неправильная разметка может легко сломать такую ​​функцию.

Но я думаю, что более простое и гораздо лучшее решение — просто добавить небольшой кусочек CSS:

white-space: pre-line;

Примените это к родителю списка (и неявно к списку и его элементам тоже). Это приведет к тому, что текст будет вести себя как обычно, за исключением того, что текст также разбит на символы новой строки в тексте.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]