У меня есть код:
$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>
«?
Чем более общий подход, тем лучше.
Приведенный ниже отрицательный прогноз утверждает, что строка не будет содержать <h1>
или же <div>
теги. Если да, то он захватывает содержимое всей строки в группу 1.
^(?!.*?(?:<h1>|<div>))(.+)$
Строка замены:
<p>$1</p>
Код:
<?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>
Других решений пока нет …