将每个段落拆分为数组的 PHP 函数

8
我可以帮你进行翻译。以下是已翻译的内容:

我想将每个段落拆分成一个数组。

我的当前方法不起作用:

$paragraphs = preg_split( '|</p>|', $text, PREG_SPLIT_OFFSET_CAPTURE );

如何从以下内容开始:

这里是需要翻译的内容

$text = <<<TEXT
        <p>Hello!</p>
        <p style="border: 1px solid black;">How are you,<br /> today?</p>
TEXT;

到这里

$paragraphs = array(
     '<p>Hello!</p>',
     '<p style="border: 1px solid black;">How are you,<br /> today?</p>'
);
4个回答

13
您可以像下面这样使用DOMDocument()来实现此功能。
 <?php
$text = <<<TEXT
    <p>Hello!</p>
    <p style="border: 1px solid black;">How are you,<br /> today?</p>
TEXT;

$dom = new DOMDocument();
$paragraphs = array();
$dom->loadHTML($text);
foreach($dom->getElementsByTagName('p') as $node)
{

    $paragraphs[] = $dom->saveHTML($node);

}
print_r($paragraphs);
?>

输出

Array
(
  [0] => <p>Hello!</p>
  [1] => <p style="border: 1px solid black;">How are you,<br> today?</p>
)

1
绝妙的解决方案。 - Terry Carter

4

您忘记了属性限制,标志是 PREG_SPLIT_DELIM_CAPTURE。

$text = <<<TEXT
        <p>Hello!</p>
        <p style="border: 1px solid black;">How are you,<br /> today?</p>
TEXT;
$paragraphs = preg_split( '|(?<=</p>)\s+(?=<p)|', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
//                                                here __^^


print_r($paragraphs);

输出:

Array
(
    [0] =>         <p>Hello!</p>
    [1] => <p style="border: 1px solid black;">How are you,<br /> today?</p>
)

如果有嵌套段落怎么办? - Let me see
@Letmesee:它肯定不太好用,但是你为什么想要嵌套段落呢? - Toto

2
可能有许多方法... 您也可以按照以下步骤进行。
$array = explode("</p>", $text);

这将把你的文本按每个 </p> 分成一个数组行,然后应用以下 for 循环添加 </p>
foreach($array as $row)
{ 
  $paragraphs[] = $row."</p>";
}

打印变量 $paragraphs 的内容。


@pbaldauf 你试过我的答案了吗?对我来说它分叉得很好。 - Shijin TR

0
如果您确定每个闭合标签都是精确的

,您可以使用explode函数:
  $paragraphs = explode('</p>', $text);

否则,如果有任何空格,您需要使用正则表达式:

  $paragraphs = preg_split('/<\/\s*p\s*>/', $text);

它是否提供了关闭标签不是</p>的情况? - pbaldauf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接