【问题标题】:use DOMXPath and function query php使用 DOMXPath 和函数查询 php
【发布时间】:2014-10-12 13:34:57
【问题描述】:

有以下html代码部分:

<ul id="tree">
  <li>
    <a href="">first</a>
    <ul>
      <li><a href="">subfirst</a></li>
      <li><a href="">subsecond</a></li>
      <li><a href="">subthird</a></li>
    </ul>
  </li>
  <li>
    <a href="">second</a>
    <ul>
      <li><a href="">subfirst</a></li>
      <li><a href="">subsecond</a></li>
      <li><a href="">subthird</a></li>
    </ul>
  </li>
</ul>

需要解析这段 html 代码并获取下一个(使用 DOMXPath::query() 和 foreach())

- first
-- subfirst
-- subsecond
-- subthird
- second
-- subfirst
-- subsecond
-- subthird

一段代码:

$xpath = new \DOMXPath($html);
$catgs = $xpath->query('//*[@id="tree"]/li/a');
foreach ($catgs as $category) {
  // first level
  echo '- ' . mb_strtolower($category->nodeValue) . '<br>';

  // second level
  // don't know
} 

提前致谢!

【问题讨论】:

  • 请编辑问题以包含您目前拥有的代码的详细信息以及您遇到的问题,包括任何错误消息或意外输出的全文。
  • 请编辑您在问题中的尝试。并让社区清楚地了解为什么这对您不起作用以及您遇到的具体问题

标签: php html xpath domdocument


【解决方案1】:

这就是 DOMBLAZE 的用途:

/* DOMBLAZE */ $doc->registerNodeClass("DOMElement","DOMBLAZE"); class DOMBLAZE extends DOMElement{public function __invoke($expression) {return $this->xpath($expression);} function xpath($expression){$result=(new DOMXPath($this->ownerDocument))->evaluate($expression,$this);return($result instanceof DOMNodeList)?new IteratorIterator($result):$result;}}

$list = $doc->getElementById('tree');

foreach ($list('./li') as $item) {
    echo '- ', $item('string(./a)'), "\n";
    foreach ($item('./ul/li') as $subitem) {
        echo '-- ', $subitem('string(./a)'), "\n";
    }
}

输出:

- first
-- subfirst
-- subsecond
-- subthird
- second
-- subfirst
-- subsecond
-- subthird

DOMBLAZE 是穷人的FluentDOM

【讨论】:

    【解决方案2】:

    对于第二级,您也可以使用另一个查询:

    $dom = new DOMDocument();
    $dom->loadHTML($markup);
    $xpath = new DOMXpath($dom);
    $elements = $xpath->query('//ul[@id="tree"]/li');
    foreach($elements as $el) {
        $head = $xpath->query('./a', $el)->item(0)->nodeValue;
        echo "- $head <br/>";
        foreach($xpath->query('./ul/li/a', $el) as $sub) { // query the second level
            echo '-- ' . $sub->nodeValue . '<br/>';
        }
    }
    

    example out

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2012-04-12
      • 2014-05-26
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多