给出字符串:
<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.'
)
);
这可能吗?似是而非?可能?
答案 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的文档。