Я бы предложил НЕ использовать функцию nl2br()
- вы собираетесь внедрить теги <br>
повсюду в тех местах, где они вам не нужны.
Вместо этого я бы предложил, чтобы вы выполняли свое регулярное выражение вне разрывов строк, игнорируя строки, уже окруженные тегами, например:
(?i)^(?!((<\/|<)(h[1-6]|ul|li|script|blockquote)(\s.+)*>))(.+)(?!(<(\/\3)>))$
Если вы хотитечтобы исключить больше тегов, поместите их в группу (h[1-6]|ul|li|script|blockquote)
.
Давайте разберем это:
(?i)
делает все следующие совпадения нечувствительными к регистру ^
утверждает позицию в начале строки ?!()
группировка является негативным прогнозом (<\/|<)
означает, что мы сопоставляем открывающий или закрывающий тег h[1-6]
соответствует h1, h2, h3 и т. Д. (\s.+)*>
соответствует дополнительному мусору внутри открывающего тега, например, <script xyz>
(.+)
- это то, чтомы хотим обернуть теги абзаца вокруг \3
in <(\/\3)>
соответствует исходному тегу, с которым мы сопоставлены, для закрывающего тега
Обратите внимание, что (.+)
в приведенном вышерегулярное выражение - это группа 5, которую вы хотите окружить тегами <p>
.Вы можете ссылаться на первую группу, используя тег $5
в вашем preg_replace()
, который позволяет вам обернуть открывающий и закрывающий тег <p>
вокруг этой группы.
Вот пример этогов действии: https://regex101.com/r/TQGbaq/2
Ваш код может выглядеть примерно так:
$regex = '#(?i)^(?!((<\/|<)(h[1-6]|ul|li|script|blockquote)(\s.+)*>))(.+)(?!(<(\/\3)>))$#';
$content = preg_replace($regex, "<p>$5</p>", $content);