Заменить двойные разрывы строк, кроме тех случаев, когда теги - PullRequest
0 голосов
/ 15 февраля 2019

В качестве переменной у меня есть некоторое количество БД, и я хочу превратить двойные разрывы строк в <p>...</p>

Для одиночных разрывов строк я хочу добавить <br />

Я могу сделать этоиспользуя:

$content = nl2br($content, false);
$content = '<p>' . preg_replace('#(<br>[\r\n\s]+){2}#', '</p><p>', $content) . '</p>';

Однако мне нужно исключить абзацы, которые имеют h2, h3, h4, ul и находятся внутри тегов ul.Но мне все равно нужно добавить теги p вокруг других тегов HTML, таких как <strong> <blockquote> <img> <i> <em> и <caption> и т. Д.

Пример текста будет:

<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit</h2>

Vivamus vel tempor turpis, <strong>non rutrum quam</strong>. Suspendisse ac rhoncus felis, eget porta lectus. 

Nam vulputate sapien risus, vel vehicula mi volutpat sed. 

<ul>
<li>Sed feugiat nibh at nisl eleifend scelerisque.</li>
<li>Aliquam non maximus ipsum. Aliquam erat volutpat.</li>
</ul>

<h3>Praesent eget diam sit amet leo vehicula sagittis at quis tortor</h3>

Nunc nec sem ac nunc tincidunt aliquam ut nec dolor. Nulla facilisi.

<img alt="xxxx" src="xxx.png" class="xxxxx"/> 

<caption><i>ccccc</i></caption> 

<img alt="xxxx" src="xxx.png" class="xxxxx"/> 

<i>ccccc</i>

<strong>Nunc nec sem ac nunc tincidunt aliquam ut nec dolor. Nulla facilisi.</strong>

Vivamus vel tempor turpis, <strong>non rutrum quam</strong>. Suspendisse ac rhoncus felis, eget porta lectus.

Nunc nec
Nunc nec
Nunc nec

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Vivamus vel tempor turpis <a href=""></a></p>&mdash; xxxxx (@xxxxxx) <a href="https://twitter.com/xxxx/status/x?ref_src=x">February 15, 2019</a></blockquote>

<script async src="" charset="utf-8"></script>

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я бы предложил НЕ использовать функцию 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);
0 голосов
/ 15 февраля 2019

Вы должны добавить <<strong> br > в список, как показано ниже:

$content = '<p>' . preg_replace('#([\<br\>\r\n\s]{2})#', '</p><p>', $content) . '</p>';
...