【问题标题】:Get DOM element string using PHP使用 PHP 获取 DOM 元素字符串
【发布时间】:2016-10-20 03:57:49
【问题描述】:

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

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

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

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

我需要的是提取&lt;div&gt; 的确切字符串,例如。 &lt;div id="myelementID" class="hello" data-foo="bar"&gt; 如果存在 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,这可能是一个更好的解决方案。

编辑 为了更清楚,我不是在寻找元素的内容。我正在寻找字符串&lt;div id="myelementID" etc="etc" this="that"&gt;。因为除了它的 ID 是“myelementID”之外,它不确定元素具有什么属性,这就是我遇到问题的原因。

【问题讨论】:

  • 我已经读过那个帖子了。这不是重复的,而是关于不同的问题,并且没有有效的答案。
  • 我认为在这种情况下你可以使用正则表达式是的。像if(preg_match("#&lt;div id="myelementID"[^&gt;]*&gt;(.*)&lt;\/div&gt;"#,$el,$match) &gt; 0) 这样的东西就足够了,$match[1] 有你的内容
  • 不要...正则表达式... html...
  • 您的正则表达式抛出错误。

标签: php html preg-match domdocument


【解决方案1】:

使用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

【讨论】:

  • 不不,你读错了问题。我不想要元素的内容。我只想要&lt;div class="hello" data-foo="bar" id="myelementID"&gt;
【解决方案2】:

一个非常简单的正则表达式(tested on RegExr)。唯一的缺点是&lt;div&gt; 的任何包含&gt; 的属性都会导致&lt;div&gt; 提前结束。

<[^>]*\sid="myelementID"[^>]*>

RegEx 的细分:

  • &lt;&lt;div的开始标签
  • [^&gt;]* 匹配任意数量的不是&gt; 的字符
  • \s 匹配空白字符(即空格)
  • id="myelementID" 匹配目标元素的 id
  • [^&gt;]* 匹配任意数量的不是&gt; 的字符
  • &gt; &lt;div&gt; 标签的结尾

【讨论】:

  • 看起来@RomanPerekhrest 是第一个到达那里的,但我已经开始了,所以我想我不妨完成!
【解决方案3】:

如果你想使用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

中测试它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 2017-07-29
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多