通过<;br><;br/><;p>;分成单独的段落


PHP preg_split Input by <br>, <br/>, <p> into Separate Paragraphs

我正在从一个包含格式非常错误的代码的页面卷曲。我正试图将页面中的一个特定片段解析为段落。该输入片段可以由<p></p>划分,或者由一个或多个<br><br/>标签分隔。在有两个<br>标签的情况下,我不希望它们是两个单独的pargaraph。

我当前试图解析/显示的代码是

$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。

以下是一个使用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>替换(重复)break的变体,最终删除起始</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修饰符来获得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
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 
)