Разбить длинный текст на абзацы EOL и & lt; p & gt; теги

Мне нужно разбить длинный текст на абзацы, чтобы сделать некоторые манипуляции.

Цели:

  1. Разбить длинный текст на абзацы на основе любой комбинации символов новой строки, <p>, а также <p id="" class="" style=""> (любая комбинация идентификатора, класса или стиля).
  2. Сохранить <p теги, когда я положил его обратно вместе

Вот что у меня так далеко:

$paragraphs = preg_split('/\r\n|\n|\r|<p?>/', $content, -1, PREG_SPLIT_NO_EMPTY);

Вот проблемы с этим:

  1. Не захватывает <p class="">
  2. Это не сохраняет <p тег

Есть ли способ сделать это с помощью preg_split?

ОБНОВЛЕННЫЙ Пример:

Входящий контент может быть:

<p class="example">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in odio ac diam interdum vulputate eget vel nisl. Aliquam felis nulla, porttitor ac elit eu, auctor blandit metus. Sed ut turpis quam. Fusce fermentum felis nec nulla hendrerit, sit amet euismod lectus hendrerit. Nullam malesuada est urna, non iaculis enim rhoncus sit amet. Vivamus metus arcu, consectetur at nisi vitae, suscipit finibus purus. Pellentesque pellentesque sapien mauris, ac dignissim ipsum rhoncus vitae. Proin nulla leo, ultrices ut diam in, condimentum efficitur urna.</p><p>Mauris felis felis, condimentum sed nisl commodo, suscipit commodo magna. Donec quis diam vel nibh commodo facilisis. Sed pretium purus non mi dapibus sagittis. Sed sed rutrum odio.</p>

Integer quis condimentum lectus. Pellentesque tristique ultrices nisi a auctor. Donec porta molestie dignissim. <p>Integer ut enim eget felis molestie ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus a venenatis turpis, sit amet commodo nulla. Aliquam nunc ligula, imperdiet sed eleifend a, convallis ut leo.</p> Praesent pharetra finibus quam, quis viverra augue blandit non. Ut commodo finibus dolor at volutpat. Etiam id elit cursus, luctus augue ac, iaculis purus. Vivamus posuere ex vitae orci dictum, consequat tincidunt lorem molestie. Fusce nec erat quis nibh pretium convallis. In pretium euismod augue at interdum. Sed magna elit, pellentesque sed elit eget, venenatis imperdiet dolor.

Необходимый массив в $ абзацах:

$paragraphs = array(
0 => '<p class="example">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in odio ac diam interdum vulputate eget vel nisl. Aliquam felis nulla, porttitor ac elit eu, auctor blandit metus. Sed ut turpis quam. Fusce fermentum felis nec nulla hendrerit, sit amet euismod lectus hendrerit. Nullam malesuada est urna, non iaculis enim rhoncus sit amet. Vivamus metus arcu, consectetur at nisi vitae, suscipit finibus purus. Pellentesque pellentesque sapien mauris, ac dignissim ipsum rhoncus vitae. Proin nulla leo, ultrices ut diam in, condimentum efficitur urna.</p>',
1 => '<p>Mauris felis felis, condimentum sed nisl commodo, suscipit commodo magna. Donec quis diam vel nibh commodo facilisis. Sed pretium purus non mi dapibus sagittis. Sed sed rutrum odio.</p>',
2 => 'Integer quis condimentum lectus. Pellentesque tristique ultrices nisi a auctor. Donec porta molestie dignissim.',
3 => '<p>Integer ut enim eget felis molestie ultrices. Cum sociis natoque       penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus a venenatis turpis, sit amet commodo nulla. Aliquam nunc ligula, imperdiet sed eleifend a, convallis ut leo.</p> Praesent pharetra finibus quam, quis viverra augue blandit non. Ut commodo finibus dolor at volutpat. Etiam id elit cursus, luctus augue ac, iaculis purus. Vivamus posuere ex vitae orci dictum, consequat tincidunt lorem molestie. Fusce nec erat quis nibh pretium convallis. In pretium euismod augue at interdum. Sed magna elit, pellentesque sed elit eget, venenatis imperdiet dolor.'
);

0

Решение

В качестве очень простого обходного пути вы можете добавить разрыв строки перед любым <p [...] а также <p>:

$content = str_replace("<p>", "\n<p>", $content);
$content = str_replace("<p ", "\n<p ", $content);

Тогда вы используете свой preg_split:

$paragraphs = preg_split('/\r\n|\n|\r/', $content, -1, PREG_SPLIT_NO_EMPTY);

Таким образом, вы захватываете любой <p [...]> и <p>s сохраняются внутри абзацев.

1

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

Этот должен работать:

$para = preg_split('~(?<=</p>)\s*|(?!\G)\s*(?=<p)~', trim($text));

разделитель описывается как позиция, которой предшествует закрывающий тег p, который может соответствовать нулю или большему количеству пробельных символов.

(?<=...) это взгляд сзади и означает предшествует. Обратите внимание, что просмотр сзади — это всего лишь тест, и что содержимое, сопоставленное внутри, не является частью полного соответствия.

\s* означает ноль или более пробельных символов.

\G является привязкой к концу предыдущего результата матча

Примечание: если вы хотите использовать в качестве разделителя абзаца новые строки, вы можете изменить шаблон на:

$para = preg_split('~(?<=</p>)\s*|(?!\G)\s*(?=<p)|\h*+\s+~', trim($text));

Но обратите внимание, что в этом случае текст, заключенный между тегами p, не должен содержать символов новой строки, чтобы иметь согласованный результат.

1

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