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

Ang*_*Guy 2 html php

鉴于字符串:

<b>Lorem ipsum dolor sit amet, <i>consectetuer adipiscing</i> elit.</b> Donec odio. Quisque volutpat mattis eros.
Run Code Online (Sandbox Code Playgroud)

我需要输出一个数组:

$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.'
    )
);
Run Code Online (Sandbox Code Playgroud)

这可能吗?似是而非?可能性有多大?

akh*_*ess 6

通过使用2种方法是可能的.

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

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

但是使用带有嵌套标签和属性的复杂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";
}
?>
Run Code Online (Sandbox Code Playgroud)

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