如何使用PHP DomDocument获取元素和内容结构?

时间:2016-07-09 13:54:19

标签: php html parsing structure domdocument

假设我想根据页面的元素和内容结构实现自动字体请求优化,如何使用PHP DomDocument获取所需信息?

简而言之,问题可以通过两个结构示例来说明:

示例1

<p><em>All italic paragraph text</em></p>

示例2

<p>Normal paragraph text <em>and some italic text</em></p>

两个示例中的元素结构相同,即具有<em>子元素的段落元素。但是,内容结构不同:示例1中的所有文本都是斜体,但示例2中包含正常和斜体文本。

我目前获取元素结构的方法是这样的:

$dom = new DOMDocument;
foreach ($dom->getElementsByTagName('p') as $elm) {
    $elms[] = $dom->saveHTML($elm);
}

然后我会迭代元素并使用相同的方法来查找<em><strong>等嵌套元素。

但我需要一个很好的方法来处理内容结构。我想我可以用<em></em>拆分文本,看看结果列表中的第一个和最后一个元素是否有长度,但这让我想起了使用正则表达式进行自定义HTML搜索,这似乎是这里推荐的方法最少。

但在这种情况下我的替代方案是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用DOMXPath查找单个文本节点:

$html = "<p>Normal paragraph text <em>and some italic text</em></p>";

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$textNodes = $xpath->query("//text()");
$elms = [];
foreach ($textNodes as $elm) {
    $elms[] = array(
        "parent" => $elm->parentNode->tagName,
        "path" => $elm->parentNode->getNodePath(),
        "text"   => $elm->textContent
    );
}

$elms将包含:

array (
  array (
    'parent' => 'p',
    'path' => '/html/body/p',
    'text' => 'Normal paragraph text ',
  ),
  array (
    'parent' => 'em',
    'path' => '/html/body/p/em',
    'text' => 'and some italic text',
  ),
)