2

给定字符串:

<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.'
    )
);

这可能吗?合理吗?可能吗?

4

1 回答 1

7

可以使用 2 种方法。

您的第一个选择是正则表达式。您可以使用解析文本preg_match()。例如,要提取标签之间的文本,您可以使用以下内容:

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

但是对于带有嵌套标签和属性的复杂 HTML 文本,使用正则表达式对字符串进行标记是相当乏味的。

在我看来,使用DOM 解析来解析 HTML 文本的 DOM 结构会更好。这种方法将使您能够逐个节点遍历文本节点,提取您需要的任何内容 - 标签、标签之间的文本、标签属性等。这是一个使用 PHP 内置 DOMDocument 解析 HTML 文本的简单示例(示例取自 php.ini 文件)。网):

$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的文档以获取有关该库的更多信息。

于 2012-11-06T10:44:37.247 回答