Как мне сопоставить блок текста, содержащий максимум одну новую строку в строке и предшествующий двум?

Как мне сопоставить блок текста, который содержит максимум одну новую строку? Блок текста может не находиться в теге. Это то, что у меня есть на данный момент.

$pPattern = '
    /(?<=\n|\A) # Preceded by a new line or at the start of the file
    (?!<.*>(?:.|\n)*<\/.*>) # Not within a tag
    (.+) # Need help here
    (?=\n\n|\Z) # Succeeded by double newlines or at end of file
/muxi';
$text = preg_replace($pPattern, "<p>$1</p>", $text);

Я безуспешно пробовал несколько разных групп захвата, таких как ((?:.+\n?)+). У кого-нибудь есть предложения?

Я нашел это: Регулярное выражение для сопоставления блока текста до первой двойной новой строки? во время поиска и пытался использовать часть этого кода, но не смог заставить его работать.

Изменить: в качестве примера я буду использовать этот блок текста в качестве примера.

<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
Nulla at erat velit, eu tristique massa.
Donec vehicula lorem et lacus ullamcorper id bibendum nisi euismod.
Vestibulum ac leo nisl, nec fermentum quam.

Maecenas velit ante, varius a interdum molestie, viverra et nunc. In elit erat, interdum in elementum eget, bibendum at augue. Praesent nec quam justo. Cras vestibulum accumsan vehicula. Curabitur leo velit, blandit eget consectetur id, commodo eu ipsum. Nulla vel lacus dolor, a suscipit purus. Aliquam euismod interdum elementum.

<ul>
   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
   <li>Aliquam tincidunt mauris eu risus.</li>
   <li>Vestibulum auctor dapibus neque.</li>
</ul>

Donec quis odio iaculis tellus suscipit porta. In hac habitasse platea dictumst. Ut sed risus diam, at ultrices mi. Vestibulum vitae leo justo, eget ultricies diam. Curabitur pharetra ornare lorem, ac semper tortor fringilla ut. Etiam et nisl felis. Quisque ac purus ipsum. Donec interdum elit ac nunc rhoncus eu pulvinar massa ornare. Fusce turpis est, commodo lacinia vulputate at, hendrerit eget tortor.

Отсюда я получаю следующий вывод:

<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
Nulla at erat velit, eu tristique massa.
Donec vehicula lorem et lacus ullamcorper id bibendum nisi euismod.
<p>Vestibulum ac leo nisl, nec fermentum quam.</p>

<p>Maecenas velit ante, varius a interdum molestie, viverra et nunc. In elit erat, interdum in elementum eget, bibendum at augue. Praesent nec quam justo. Cras vestibulum accumsan vehicula. Curabitur leo velit, blandit eget consectetur id, commodo eu ipsum. Nulla vel lacus dolor, a suscipit purus. Aliquam euismod interdum elementum.</p>

<ul>
   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
   <li>Aliquam tincidunt mauris eu risus.</li>
   <li>Vestibulum auctor dapibus neque.</li>
<p></ul></p>

<p>Donec quis odio iaculis tellus suscipit porta. In hac habitasse platea dictumst. Ut sed risus diam, at ultrices mi. Vestibulum vitae leo justo, eget ultricies diam. Curabitur pharetra ornare lorem, ac semper tortor fringilla ut. Etiam et nisl felis. Quisque ac purus ipsum. Donec interdum elit ac nunc rhoncus eu pulvinar massa ornare. Fusce turpis est, commodo lacinia vulputate at, hendrerit eget tortor.</p>

Но я хочу этот вывод:

<h2>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h2>
<p>Nulla at erat velit, eu tristique massa.
Donec vehicula lorem et lacus ullamcorper id bibendum nisi euismod.
Vestibulum ac leo nisl, nec fermentum quam.</p>

<p>Maecenas velit ante, varius a interdum molestie, viverra et nunc. In elit erat, interdum in elementum eget, bibendum at augue. Praesent nec quam justo. Cras vestibulum accumsan vehicula. Curabitur leo velit, blandit eget consectetur id, commodo eu ipsum. Nulla vel lacus dolor, a suscipit purus. Aliquam euismod interdum elementum.</p>

<ul>
   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>
   <li>Aliquam tincidunt mauris eu risus.</li>
   <li>Vestibulum auctor dapibus neque.</li>
</ul>

<p>Donec quis odio iaculis tellus suscipit porta. In hac habitasse platea dictumst. Ut sed risus diam, at ultrices mi. Vestibulum vitae leo justo, eget ultricies diam. Curabitur pharetra ornare lorem, ac semper tortor fringilla ut. Etiam et nisl felis. Quisque ac purus ipsum. Donec interdum elit ac nunc rhoncus eu pulvinar massa ornare. Fusce turpis est, commodo lacinia vulputate at, hendrerit eget tortor.</p>

person Hultner    schedule 17.02.2011    source источник
comment
Пожалуйста, уточните: что вы пытаетесь сопоставить? Можете привести пару примеров? Что не работает с вашим текущим регулярным выражением?   -  person Tim    schedule 17.02.2011
comment
@Tim Nordenfur: я обновил свой вопрос примером. Надеюсь, теперь вы понимаете, что я имею в виду.   -  person Hultner    schedule 17.02.2011
comment
А как насчет one line\n<h1>a header</h1>\nanother line? или a line <a href="a.htm">with a link</a> in it?   -  person jswolf19    schedule 17.02.2011
comment
За исключением этой вещи с тегом «вход-выход», я бы просто читал это по абзацу за раз.   -  person tchrist    schedule 17.02.2011
comment
Я точно знаю, какие теги будет содержать строка, и она будет содержать только теги ul, li и h2.   -  person Hultner    schedule 17.02.2011


Ответы (1)


Пытаться

preg_replace("/(\n\n|^)([^<].*)(\n\n|$)/U", '$1<p>$2</p>$3', $str);

Он заключает в ‹p›‹/p› все текстовые части между (\n\n ИЛИ начало строки) И (\n\n ИЛИ конец строки) И начинается с любого символа, кроме «‹» (что говорит о том, что строка начинается с тега).

person Hnatt    schedule 16.07.2011
comment
Я не знаю, правильно ли это, но мне как-то удалось это понять, я просто не помню, как. Это пол года. - person Hultner; 16.07.2011
comment
Ой. Я искал оставшиеся без ответа вопросы о регулярных выражениях и не заметил дату. - person Hnatt; 17.07.2011