在EOL上将长文本拆分为段落,<;p>;标签


Split long text into paragraphs on EOL and <p> tags

我需要将一个长文本拆分为多个段落,以便进行一些操作。

目标:

  1. 根据换行符、<p><p id="" class="" style="">的任意组合(id、类或样式的任意组合)将长文本拆分为段落
  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.'
);

作为一个非常简单的解决方法,您可以在任何<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>会保留在段落中。

这个应该有效:

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

分隔符被描述为前面有一个结束p标记的位置,该标记可以匹配零个或多个空白字符。

(?<=...)是一个lookbacking,意思是前面有。注意,查找只是一个测试,内部匹配的内容不是整个匹配的一部分

's*表示零个或多个空白字符。

'G是上一个匹配结果结束的锚

注意:如果您想将换行符作为段落分隔符,可以将模式更改为:

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

但请注意,在这种情况下,p标记之间的文本必须不包含换行符才能产生连贯的结果。