PHP preg_split 输入 <br>, <br/>, <p> 分段落
PHP preg_split Input by <br>, <br/>, <p> into Separate Paragraphs
我正在浏览一个代码格式非常错误的页面。我试图将页面的特定片段解析为段落。此输入片段可以被 <p>
和 </p>
分开,或者被一个或多个 <br>
或 <br/>
标签分隔。如果有两个 <br>
标签接一个,我不希望它们是两个单独的 pargaraphs。
我目前尝试 parse/display 的代码是
$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>";
}
但是,这没有按预期工作。一些不同的inputs/outputs如下:
输入 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>
我的代码是将输入解析为段落;但是,它还添加了仅包含 space.
的额外段落
如有任何帮助,我们将不胜感激。
输入是 UTF-8,如果它有所不同。
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
)
这是 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>
替换(重复)breaks 的变体,最后删除开始的 </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
我正在浏览一个代码格式非常错误的页面。我试图将页面的特定片段解析为段落。此输入片段可以被 <p>
和 </p>
分开,或者被一个或多个 <br>
或 <br/>
标签分隔。如果有两个 <br>
标签接一个,我不希望它们是两个单独的 pargaraphs。
我目前尝试 parse/display 的代码是
$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>";
}
但是,这没有按预期工作。一些不同的inputs/outputs如下:
输入 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>
我的代码是将输入解析为段落;但是,它还添加了仅包含 space.
的额外段落如有任何帮助,我们将不胜感激。
输入是 UTF-8,如果它有所不同。
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
)
这是 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>
替换(重复)breaks 的变体,最后删除开始的 </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