使用 PHP 获取 DOM 元素字符串

Get DOM element string using PHP

我有一组 html 个字符串,看起来像这样:

<div id="myelementID" class="hello" data-foo="bar"> ... </div>

<div id="myelementID" class="world" data-this="that"> ... </div>

等等,你明白了。除了id="myelementID",其他所有属性都不固定。

我需要的是提取 <div> 的确切字符串,例如。 <div id="myelementID" class="hello" data-foo="bar"> 如果 ID 为 "myelementID" 的元素存在。

截至目前,我可以使用 DomDocument 检查元素是否存在:

        $dom = new DomDocument;
        $dom->validateOnParse = true;
        $internalErrors = libxml_use_internal_errors(true);
        $dom->loadHTML($html_string);
        libxml_use_internal_errors($internalErrors);
        $el = $dom->getElementById("myelementID");

如何从这里获取元素的 HTML 字符串?我也愿意使用 preg_match,这可能是更好的解决方案。

编辑 更清楚地说,我不是在寻找元素的内容。我正在寻找字符串 <div id="myelementID" etc="etc" this="that">。因为除了它的 ID 是 "myelementID" 之外,不确定该元素具有哪些属性,这就是我遇到问题的原因。

使用DOMNode::C14N方法将节点规范化为字符串,substrstrpos函数获取所需的片段:

...
$el = $dom->getElementById("myelementID");
$elString = $el->C14N();

var_dump(substr($elString, 0, strpos($elString, '>') + 1));

输出(以你的例子为例):

string(51) "<div class="hello" data-foo="bar" id="myelementID">"

http://php.net/manual/ru/domnode.c14n.php

一个非常简单的正则表达式,它可以工作 (tested on RegExr)。唯一的缺点是 <div> 的任何包含 > 的属性都会导致 <div>.

过早结束
<[^>]*\sid="myelementID"[^>]*>

正则表达式的细分:

  • < <div
  • 的起始标签
  • [^>]* 匹配不属于 >
  • 的任意数量的字符
  • \s 匹配白色 space 字符(即 space)
  • id="myelementID" 匹配你的目标元素的 id
  • [^>]* 匹配不属于 >
  • 的任意数量的字符
  • > <div> 标签结束

想用DomDocument可以用底码。在底部代码中,我使用 foreach() 迭代元素属性,然后将属性名称和属性值存储在 $elemString 变量中。

$html_string = '<div id="myelem4entID" class="hello" data-foo="bar">...</div>';

$dom = new DomDocument;
$dom -> loadHTML($html_string);
$el = $dom -> getElementById("myelementID");

if (!empty($el))
{
    $elemString = "<div";
    foreach ($el -> attributes as $attr) 
    {
        $name = $attr -> nodeName;
        $value = $attr -> nodeValue;    
        $elemString .= " {$name}=\"{$value}\"";
    }
    $elemString .= ">";
}

demo

中测试