如何使用PHP xpath获取所有属性?

给定以下HTML字符串:</ p>

 &lt; div \  nclass =“example-class”
data-caption =“示例标题”
data-link =“https://www.example.com”
data-image-url =“https://example.com/example。 jpg“&gt;
&lt; / div&gt;
</ code> </ pre>

如何使用带xpath的PHP输出/检索具有键/值对所有属性的数组?< / p>

希望输出如:</ p>

  Array 

[data-caption] =&gt;示例标题
[数据 - 链接] =&gt; https://www.example.com
[data-image-url] =&gt; https://example.com/example.jpg
)
//等等... \ n </ code> </ pre>

我知道如何获得个人属性,但我希望能一下子做到。 这是我目前所拥有的:</ p>

  function get_data($ html =''){

$ dom = new DOMDocument();
$ dom-&gt; loadHTML ($ html);
$ xpath = new DOMXPath($ dom);

$ nodes = $ xpath-&gt; query('// div / @ data-link');

foreach($ 节点为$ node){
var_dump($ node);
}

}
</ </ code> </ pre>

谢谢!</ p>
</ div >

展开原文

原文

Given the following HTML string:

<div 
class="example-class" 
data-caption="Example caption" 
data-link="https://www.example.com" 
data-image-url="https://example.com/example.jpg">
</div>

How can I use PHP with xpath to output / retrieve an array with all attributes as key / value pairs?

Hoping for output like:

Array
(
    [data-caption] => Example caption
    [data-link] => https://www.example.com
    [data-image-url] => https://example.com/example.jpg
)
// etc etc...

I know how to get individual attributes, but I'm hoping to do it in one fell swoop. Here's what I currently have:

function get_data($html = '') {

    $dom = new DOMDocument();
    $dom->loadHTML($html);
    $xpath = new DOMXPath($dom);

    $nodes = $xpath->query('//div/@data-link');

    foreach ($nodes as $node) {
        var_dump($node);
    }

}

Thanks!

2个回答



在XPath中,您可以使用 @ * </ code>来引用任何名称的属性,例如:</ p >

  $ nodes = $ xpath-&gt; query('// div / @ *'); 

foreach($ nodes as $ node){
echo $ node-&gt ; nodeName。“:”。 $ node-&gt; nodeValue。“&lt; br&gt;”;
}
</ code> </ pre>

eval.in demo </ code> </ kbd> </ strong> </ p>

输出: </ strong> </ p>

  class:example-class 
data-caption:示例标题
data-link:https://www.example.com
data-image-url :https://example.com/example.jpg

</ div>

展开原文

原文

In XPath, you can use @* to reference attributes of any name, for example :

$nodes = $xpath->query('//div/@*');

foreach ($nodes as $node) {
    echo $node->nodeName ." :  ". $node->nodeValue ."<br>";
}

eval.in demo

output :

class :  example-class
data-caption :  Example caption
data-link :  https://www.example.com
data-image-url :  https://example.com/example.jpg

doutan1857
doutan1857 非常感谢。 这很好 - 虽然在我的情况下我将项目推送到一个数组,如下所示:$ myarray = array(); $ myarray [$ node-> nodeName] = $ node-> nodeValue;
接近 5 年之前 回复



我认为这应该做你想要的 - 或者至少为你提供继续的基础。</ p>

  define('BR','&lt; br /&gt;'); 
$ strhtml ='&lt; div
class =“example-class”
data-caption =“示例标题”

data-link =“https://www.example.com”
data-image-url =“https://example.com/example.jpg”&gt;
&lt; / div&gt;'; \ n
$ dom = new DOMDocument;
$ dom-&gt; loadHTML($ strhtml);

$ xpath = new DOMXPath($ dom);
$ col = $ xpath-&gt; query('/ / div');
if($ col){
foreach($ col as $ node)if($ node-&gt; nodeType == XML_ELEMENT_NODE){
foreach($ node-&gt; properties as $ attr) echo $ attr-&gt; nodeName。' '。$ attr-&gt; nodeValue.BR;
}
}
$ dom = $ col = $ xpath = null;
</ code> </ pre>
</ div>

展开原文

原文

I think this should do what you want - or at least, give you the basis to proceed.

    define('BR','<br />');
    $strhtml='<div 
        class="example-class" 
        data-caption="Example caption" 
        data-link="https://www.example.com" 
        data-image-url="https://example.com/example.jpg">
        </div>';

    $dom=new DOMDocument;
    $dom->loadHTML( $strhtml );

    $xpath=new DOMXPath( $dom );
    $col=$xpath->query('//div');
    if( $col ){
        foreach( $col as $node ) if( $node->nodeType==XML_ELEMENT_NODE ) {
            foreach( $node->attributes as $attr ) echo $attr->nodeName.' '.$attr->nodeValue.BR;
        }
    }
    $dom = $col = $xpath = null;

dongyi5817
dongyi5817 没关系 - 我投票不是因为它很简单
接近 5 年之前 回复
douluanji8752
douluanji8752 多亏了这一点,虽然它有效,但我根据它的简单性和我已有的相似性选择了另一张海报的答案。
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐