regex — обернуть все фрагменты (которые не находятся внутри тега & lt; div & gt; или & lt; h & gt;) с помощью & lt; p & gt; в переполнении стека

У меня есть код:

$html =
'<h1>Headline</h1>
That should be paragraph 1.

That should be paragraph 2.

<div>Something.</div>
That should be paragraph 3.
';

И я хочу изменить это на:

$html =
'<h1>Headline</h1>
<p>That should be paragraph 1.</p>

<p>That should be paragraph 2.</p>

<div>Something.</div>
<p>That should be paragraph 3.</p>
';

Но как добиться этого в PHP?

Я думал о замене каждой пустой строки <p>, </p> или же </p><p>на основе некоторого счетчика открытых / закрытых абзацев. Но это заставит пользователя делать такие новые строки после каждого </h1>,

Может быть, некоторые регулярное выражение будет делать работу, не ограничивая пользователя «вы должны делать новые строки после </h1> и раньше <h1>«?

Чем более общий подход, тем лучше.

2

Решение

Приведенный ниже отрицательный прогноз утверждает, что строка не будет содержать <h1> или же <div> теги. Если да, то он захватывает содержимое всей строки в группу 1.

^(?!.*?(?:<h1>|<div>))(.+)$

Строка замены:

<p>$1</p>

DEMO

Код:

<?php
$string = <<<EOT
<h1>Headline</h1>
That should be paragraph 1.

That should be paragraph 2.

<div>Something.</div>
That should be paragraph 3.
EOT;
echo preg_replace('~^(?!.*?(?:<h1>|<div>))(.+)$~m', '<p>$1</p>', $string)
?>

Выход:

<h1>Headline</h1>
<p>That should be paragraph 1.</p>

<p>That should be paragraph 2.</p>

<div>Something.</div>
<p>That should be paragraph 3.</p>
3

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

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

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