使用PHP将HTML字符串转换为文本格式数组

时间:2012-11-06 10:23:50

标签: php html

给出字符串:

<b>Lorem ipsum dolor sit amet, <i>consectetuer adipiscing</i> elit.</b> Donec odio. Quisque volutpat mattis eros.

我需要输出一个数组:

$output = array(
    array(
        'text'=>'Lorem ipsum dolor sit amet, ',
        'formats' => array('bold')
    ),
    array(
        'text'=>'consectetuer adipiscing',
        'formats' => array('bold','italic')
    ),
    array(
        'text'=>' elit.',
        'formats' => array('bold')
    ),
    array(
        'text'=>'  Donec odio. Quisque volutpat mattis eros.'
    )
);

这可能吗?似是而非?可能?

1 个答案:

答案 0 :(得分:6)

可以使用2种方法。

您的第一个选项是正则表达式。您可以使用preg_match()解析文本。例如,要在标记之间删除文本,您可以使用以下内容:

preg_match("@<[^>]>([^<]+)</[^>]>@", $yourHtmltext, $m);
// $m[1] will contain the text between tags
echo $m1;

但是使用带有嵌套标签和属性的复杂HTML文本用正则表达式标记字符串是相当繁琐的。

在我看来,使用 DOM解析来解析HTML文本的DOM结构会好得多。这种方法将使您能够逐个节点地提取文本节点 - 标记,标记之间的文本,标记attrtibites等。这是使用PHP的内置DOMDocument来解析HTML文本的一个简单示例(示例来自php。净值):

$myhtml = <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another Hello World!</a></p>
</body>
</html>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($myhtml);

$tags = $doc->getElementsByTagName('a');

foreach ($tags as $tag) {
       echo $tag->getAttribute('href').' | '.$tag->nodeValue."\n";
}
?>

使用DOM解析而不是正则表达式的额外好处是能够解析任意复杂结构的HTML文本,并且更容易采用脚本,以便将来对HTML文本结构或要求进行更改。有关该库的更多信息,请查看有关DOMDocument的文档。