【问题标题】:Php how to extract the recursive list from html in php using dom?php如何使用dom从php中的html中提取递归列表?
【发布时间】:2019-01-29 21:11:58
【问题描述】:

下面是 HTML 中的递归列表

<ul>
<li>
     <ul>
     <li>Sub-Item 1</li>
     <li>Sub-Item 2</li>
     </ul>
</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>

我想提取主ul的第一个和第三个列表元素。

这里是代码

$xpath = new DOMXPath($dom);

// to get first list item of main ul <ul><li>Sub-Item 1<li>
 //    <li>Sub-Item 2<li></ul>
$nav =$xpath->query('//li[1]');
echo $nav->item(0)->nodeValue;

//to get second list itrm of main ul <li>Item 3</li>
$nav =$xpath->query('//li[3]');
echo $nav->item(0)->nodeValue;

但我得到这个作为输出

   <li>Sub-Item 1<li>
    <li>Sub-Item 2<li>

    <li>Sub-Item 3<li> 

它正在考虑第二个 XPath 查询中的子列表。有人可以告诉我正确的查询是什么。我是 dom 的新手。

编辑:主要目标是将其保存为PHP数组,如下所示

 Array
(
    [0] => Array
        (
            [0] => Sub-Item 1
            [1] => Sub-Item 2
        )

    [1] => Item 2
    [2] => Item 3
)

【问题讨论】:

  • 首先,将字符串末尾的&lt;li&gt;改为关闭标签&lt;/li&gt; - &lt;li&gt;Sub-Item 1&lt;/li&gt;。在下一行
  • 忽略这是一个错字我为了html的简单而手动编写的......更正

标签: php dom xpath


【解决方案1】:

$rez =$xpath->query('(//ul/li)[1]');//for first

$rez =$xpath->query('(//ul/li)[last()]'); //最后一个

【讨论】:

  • 好尝试..感谢您的回答,但我需要一种通用方法,其中将有许多 li 元素和许多递归 li 并希望将它们获取并存储在数组中
  • 你能举一个输出的例子吗?你只需要main ul的第一个和第三个元素吗?
  • 数组 ( [0] => 数组 ( [0] => 子项 1 [1] => 子项 2 ) [1] => 项 2 [2] => 项 3 )
【解决方案2】:

Xpath 不会重新排列节点,因此嵌套结构是不可能的。返回值是一个节点列表,它们保持其在文档中的位置(父、子、...)。要创建递归数组结构,您将需要更多 PHP 逻辑:

function readListElement(\DOMElement $li) {
    // get an xpath instance
    $xpath = new DOMXpath($li->ownerDocument);
    // check if the node has an ul child
    if ($xpath->evaluate('count(ul) = 0', $li)) {
        // if not return the text inside
        return $li->textContent;
    }
    // otherwise 
    $result = [];
    // iterate the inner ul li elements
    foreach ($xpath->evaluate('ul/li', $li) as $liChild) {
        // and call the function itself
        $result[] = readListElement($liChild);
    }
    return $result;
}

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);

// get the top level ul (has no ul ancestor)
foreach ($xpath->evaluate('//ul[not(ancestor::ul)]') as $ul) {
    $result = [];
    foreach ($xpath->evaluate('li', $ul) as $li) {
      $result[] = readListElement($li);
    }
    var_dump($result);
}

输出:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(10) "Sub-Item 1"
    [1]=>
    string(10) "Sub-Item 2" 
  } 
  [1]=> 
  string(6) "Item 2" 
  [2]=> 
  string(6) "Item 3" 
}

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 2020-06-30
    • 2016-09-10
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多