1

文章分词有两种情况:


 1. < p > the first paragraph < / p > < p > the second paragraph < / p >...
 2. < p > the first period of < br / > < br / > the second paragraph < br / > < br / > the third paragraph < / p >

我编写代码如下:


$body_arr = preg_split('/\<\/?p\>/',$body,-1,PREG_SPLIT_NO_EMPTY);
echo count($body_arr);
    if(count($body_arr)<4) 
    {
       $body_arr = preg_split('/(\<br\/?\>)\s*\\1/',$body,-1,PREG_SPLIT_NO_EMPTY);
       $body1 = $body2 = $body3 = '';
       $total = count($body_arr);
       $maxed = max(floor($total / 2), 3);
       foreach ($body_arr as $k => $v) 
       {
            if ($k == 0) 
            {
                $body1 = $v . "<br><br>";
            } 
            else if ($k < $maxed) 
            {
                $body2.=$v . "<br><br>";
            } 
            else 
            {
                $body3.=$v . "<br><br>"  ;
            }
       }
     }
  • 这是第二个

  • 结果是错误的。

4

1 回答 1

0

您可以使用嵌套组使用单个正则表达式拆分文本。您从 ap 标记开始,然后是多个段落,这些段落以另一个关闭/打开 p 标记、一对 br 标记或最后一个关闭 p 标记结尾。

关闭/打开 p 标签可以用以下方式表示:

<\s*//*\s*p\s*>[\s|\r|\n]*<\s*p\s*>

双 br 标签可以用以下方式表示:

<\s*br\s*//*\s*>[\s|\r|\n]*<\s*br\s*//*\s*>

关闭 p 标记可以用以下方式表示:

<\s*//*\s*p\s*>

请注意,我允许标签之间留有空格,因为您在示例中使用了它,但如果没有必要,请删除 \s*。使用一些嵌套组将它们缝合在一起,你最终会得到这样的结果:

<\s*p\s*>((?<Paragraph>[^<]*)((<\s*//*\s*p\s*>[\s|\r|\n]*<\s*p\s*>)|(<\s*br\s*//*\s*>[\s|\r|\n]*<\s*br\s*//*\s*>)|(<\s*//*\s*p\s*>)))*

我用你的例子测试了它并且它有效。在示例中,我假设您在段落中间没有标签,但如果不是这种情况,您将不得不使用比标签开头更精美的东西来捕获实际文本。

于 2012-07-23T02:02:49.923 回答