使用正则表达式提取文章的每个部分

时间:2012-07-04 07:11:42

标签: php html regex

文章细分有两种情况:


 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>"  ;
            }
       }
     }
  • 这是第二个

  • 结果是错误的。

1 个答案:

答案 0 :(得分:0)

您可以使用嵌套组使用单个正则表达式拆分文本。你开始使用p标签,然后是多个段落,这些段落以另一个close / open p标签,一对br标签或最终的close p标签结束。

close / open p标记可以用以下代码表示:

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

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

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

close 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*>)))*

我用你的例子对它进行了测试,但它确实有用。从示例中我假设您在段落中间没有标签,但是如果不是这样的话,您将不得不使用比标签开头更漂亮的东西来捕获实际文本。