1

記事のセグメンテーションには、次の 2 種類のケースがあります。


 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>"  ;
            }
       }
     }
  • 2番目です

  • 結果は間違っています。

4

1 に答える 1

0

ネストされたグループを使用して、単一の正規表現でテキストを分割できます。ap タグで開始し、その後に別の終了/開始 p タグ、br タグのペア、または最後の終了 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*>

また、終了 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 に答える