将长文本拆分为EOL和<p>标签</p>中的段落

时间:2014-09-30 16:12:00

标签: php regex preg-split

我需要将长文本拆分成段落才能进行一些操作。

目标:

  1. 根据换行符<p><p id="" class="" style="">(ID,类或样式的任意组合)的任意组合将长文本拆分为段落。
  2. 保留<p标签,以便我将其重新组合在一起
  3. 这是我到目前为止所拥有的:

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

    以下是它的问题:

    1. 它不会捕获<p class="">
    2. 它不会保留<p代码
    3. 有没有办法使用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.
      

      $ paragraph中需要的数组:

      $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.'
      );
      

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这个应该有效:

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

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

(?<=...)是一个后视,意味着开头。请注意,lookbehind只是一个测试,内部匹配的内容不是整个匹配的一部分

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

\G是上一个匹配结果

结尾的锚点

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

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

但请注意,在这种情况下,p标签之间的文本不得包含换行符,以获得一致的结果。