PHP preg_split通过<br/>,<br/>,<p>输入到单独的段落中

时间:2016-01-07 16:27:54

标签: php preg-replace preg-match preg-match-all preg-split

我正在从一个包含非常错误代码的页面卷曲。我试图解析段落的页面有一个特定的片段。此输入代码段可以除以<p></p>,也可以由一个或多个<br><br/>标记分隔。如果有两个<br>标签接一个,我不希望这些标签是两个独立的pargaraphs。

我正在尝试解析/显示的当前代码是

$paragraphs = preg_split('/(<\s*p\s*\/?>)|(<\s*br\s*\/?>)|(\s\s+)|(<\s*\/p\s*\/?>)/', $article, -1, PREG_SPLIT_NO_EMPTY);
$paragraphcount = count($paragraphs);
for($x = 1; $x <= $paragraphcount; $x++ )
    {
    echo "<p>".$paragraphs[$x-1]."</p>";
    }

但是,这没有按预期工作。一些不同的输入/输出如下:

输入1:first part </p> <p> second part </p> <p> third part </p> <p> fourth part <br/>

输出1:<p>first part </p><p> </p><p>second part </p><p> </p><p> third part </p><p> </p><p>fourth part</p><p> </p>

我的代码 将输入解析为段落;但是,它还添加了仅包含空格的额外段落。

任何帮助都将不胜感激。

输入为UTF-8,如果它有所不同。

2 个答案:

答案 0 :(得分:2)

print_r(preg_split('/((<\s*p\s*\/?>\s*)|(<\s*br\s*\/?>\s*)|(\s\s+)|(<\s*\/p\s*\/?>\s*))+/', $article, -1, PREG_SPLIT_NO_EMPTY));

结果:

Array
(
    [0] => first part 
    [1] => second part 
    [2] => third part 
    [3] => fourth part 
)

答案 1 :(得分:2)

以下是preg_replace的解决方案:

$article = "first part </p> <p> second part </p> <p> third part </p> 
            <p> fourth part <br/> <br> fifth part";
$healed = substr(
          preg_replace('/(\s*<(\/?p|br)\s*\/?>\s*)+/u', "</p><p>", "<p>$article<p>"),
          4, -3);

首先将字符串包裹在<p>中,然后用</p><p>替换(重复)中断的变体,最后删除起始</p>和结束<p>。请注意,这不会产生(中间)数组,而是产生最终字符串。

echo $healed;

输出:

<p>first part</p><p>second part</p><p>third part</p><p>fourth part</p><p>fifth part</p>

请注意,您需要正则表达式末尾的u modifier才能获得UTF-8支持。

如果另一方面你需要数组中的段落,那么preg_split更适合(使用相同的正则表达式):

$paragraphs = preg_split('/(\s*<(\/?p|br)\s*\/?>\s*)+/u',
                         $article, null, PREG_SPLIT_NO_EMPTY);

如果你那么写:

foreach ($paragraphs as $paragraph) {
    echo "$paragraph\n";
}

你得到:

first part
second part
third part
fourth part
fifth part
相关问题