文章细分有两种情况:
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>" ;
}
}
}
这是第二个
结果是错误的。
答案 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*>)))*
我用你的例子对它进行了测试,但它确实有用。从示例中我假设您在段落中间没有标签,但是如果不是这样的话,您将不得不使用比标签开头更漂亮的东西来捕获实际文本。