【问题标题】:How to get both element and content structure using PHPs DomDocument?如何使用 PHPs DomDocument 获取元素和内容结构?
【发布时间】:2016-11-11 23:03:33
【问题描述】:

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

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

示例 1

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

示例 2

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

两个示例中的元素结构相同,即带有&lt;em&gt; 子元素的段落元素。但是,内容结构不同:示例 1 中的所有文本都是斜体,但示例 2 中既有普通文本也有斜体文本。

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

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

然后我将遍历元素并使用相同的方法来查找嵌套元素,例如 &lt;em&gt;&lt;strong&gt;

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

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

【问题讨论】:

    标签: php html parsing structure domdocument


    【解决方案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',
      ),
    )
    

    【讨论】:

    • 非常感谢!这似乎正是我想要的。即使它不是 DomDocument,它仍然是原生 php,这正是我真正追求的。谢谢。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多