【问题标题】:Getting a single array containing div class names and their inner li class names using php dom xpath query使用 php dom xpath 查询获取包含 div 类名及其内部 li 类名的单个数组
【发布时间】:2021-03-03 16:29:52
【问题描述】:

有人可以帮我解决这个问题吗,我收到的类似问题的假设答案并没有真正回答。我有 2 个针对 html 源的 xpath 查询,1 个返回一个 div 类名数组,其中包含其名称中的“top-menu”,另一个返回一个内部 li 类名数组(这些 div 类名包含“顶部菜单”)。有没有一种优雅的方式来组合 2,以便只以以下格式返回一个数组?

Array
(
[0] => top-menu top-menu-2
   (
    [0] => menu-item top-menu-item top-menu-item-1
    [1] => menu-item top-menu-item top-menu-item-2
   )
[1] => top-menu top-menu-8
  (
    [0] => menu-item x
  )
 )

HTML来源:

  <div class="top-menu top-menu-2">
  <ul class="j-menu">
          <li class="menu-item top-menu-item top-menu-item-1">               
    </li>
          <li class="menu-item top-menu-item top-menu-item-2">
    </li>
  </ul>
 </div>
 <div class="top-menu top-menu-8">
 <ul class="j-menu">
          <li class="menu-item x">               
          </li>
  </ul>
 </div>

返回父div类的内部li类名称数组的代码(名称中包含“top-menu”):

  $doc = new DOMDocument();
  $doc->loadHTML($data);
  $xpath = new DOMXpath($doc);
  $targets = $xpath->query(".//div[contains(@class, 'top-menu')]//li/@class");
  $classNames_array = array();
  foreach ($targets as $target) {
  $classNames_array[] = $target->textContent;
  }
  print_r(array_values($classNames_array));

返回包含“top-menu”的div类名数组的代码

   $doc = new DOMDocument();
   $doc->loadHTML($data);
   $xpath = new DOMXpath($doc);
   $targets = $xpath->query(".//div[contains(@class, 'top-menu')]");
   $classNames_array = array();
   foreach ($targets as $target) {
   $classNames_array[] = $target->textContent;
   }
    print_r(array_values($classNames_array));

【问题讨论】:

    标签: php dom xpath


    【解决方案1】:

    您可以有两个 XPath 步骤:一个是查找 div,然后对于每个 div,一个是查找其对应的列表项:

    $doc = new DOMDocument();
    $doc->loadHTML($data);
    $xpath = new DOMXpath($doc);
    
    $classNames = [];
    
    foreach ($xpath->query(".//div[contains(@class, 'top-menu')]") as $div) {
        $divClass = $div->getAttribute('class');
        foreach ($xpath->query('.//li/@class', $div) as $liClass) {
            $classNames[$divClass][] = $liClass->textContent;
        }
    }
    
    print_r($classNames);
    

    第二个调用使用DOMXPath::query 的第二个参数$contextNode

    Demo

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 2016-04-05
      • 1970-01-01
      • 2020-12-11
      • 2021-12-28
      • 1970-01-01
      • 2012-01-30
      • 2023-03-13
      • 2018-06-08
      相关资源
      最近更新 更多