PHP用HTML标签分割字符串

3
假设字符串$a保存了
<p>Phasellus blandit enim eget odio euismod eu dictum quam scelerisque.
</p><p>Sed ut diam nisi.</p><p>Ut vestibulum volutpat luctus.</p>

如何将此字符串分解为数组
Array(
    [0] = '<p>Phasellus blandit enim eget odio euismod eu dictum quam scelerisque.</p>';
    [1] = '<p>Sed ut diam nisi. Ut vestibulum volutpat luctus.</p>';
    [2] = '<p>Ut vestibulum volutpat luctus.</p>';
)
2个回答

8
使用DOMDocument和DOMXPath(如果只需要简单的解决方案,则有点过度):
$dom = new DOMDocument();
$dom->loadHTML($a);
$domx = new DOMXPath($dom);
$entries = $domx->evaluate("//p");
$arr = array();
foreach ($entries as $entry) {
    $arr[] = '<' . $entry->tagName . '>' . $entry->nodeValue .  '</' . $entry->tagName . '>';
}
print_r($arr);

1
您可以首先调用 libxml_use_internal_errors(true); 来避免 DOMDocument 将 HTML 相关错误污染到标准错误处理程序中。而是实现自己的处理程序来捕获这些错误。有关更多信息,请参见 http://php.net/manual/de/domdocument.loadhtml.php 中的注释。 - Bernhard Fürst

6
<?php
$ps    = array();
$count = preg_match_all('/<p[^>]*>(.*?)<\/p>/is', $a, $matches);
for ($i = 0; $i < $count; ++$i) {
    $ps[] = $matches[0][$i];
}

这可能是一种方法。或者你可以使用strpos循环。


preg 对于像这样的基本解析更快。 - drew010
我们正在谈论PHP及其速度缓慢的问题。无论如何,你可以在它上面节省几毫秒,但是为了让这段代码能够处理更复杂的字符串,你可能会浪费几个小时的时间。 - k102
不错的演示,但这不是正确的方法~使用正则表达式解析HTML会导致灾难... - Edward J Beckett

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