PHP Xpath: получить все значения href, содержащие иглу

Работа с PHP Xpath, пытающимся быстро получить определенные ссылки на html-странице.

Следующее найдет все ссылки href на mypage.html: $nodes = $x->query("//a[@href]");

Принимая во внимание, что ниже будут найдены все ссылки href, где описание соответствует моей игле: $nodes = $x->query("//a[contains(@href,'click me')]");

Чего я пытаюсь добиться, так это сопоставления самого href, более конкретного поиска URL-адресов, содержащих определенные параметры. Возможно ли это в запросе Xpath или я должен просто начать манипулировать выводом первого запроса Xpath?


person MattW    schedule 06.03.2010    source источник
comment
Да, но поиск «иглы» возвращает текстовую часть в $node-›nodeValue();, а не желаемый example.com?param=needle ...?   -  person MattW    schedule 06.03.2010


Ответы (1)


Не уверен, что правильно понял вопрос, но второе выражение XPath уже делает то, что вы описываете. Он соответствует не текстовому узлу элемента A, а атрибуту href:

$html = <<< HTML
<ul>
    <li>
        <a href="http://example.com/page?foo=bar">Description</a>
    </li>
    <li>
        <a href="http://example.com/page?lang=de">Description</a>
    </li>
</ul>
HTML;

$xml  = simplexml_load_string($html);
$list = $xml->xpath("//a[contains(@href,'foo')]");

Выходы:

array(1) {
  [0]=>
  object(SimpleXMLElement)#2 (2) {
    ["@attributes"]=>
    array(1) {
      ["href"]=>
      string(31) "http://example.com/page?foo=bar"
    }
    [0]=>
    string(11) "Description"
  }
}

Как видите, возвращенный NodeList содержит только элемент A с href, содержащим foo (я так понимаю, это то, что вы ищете). Он содержит весь элемент, потому что XPath преобразуется в Выбрать все элементы A с атрибутом href, содержащим foo. Затем вы получите доступ к атрибуту с помощью

echo $list[0]['href'] // gives "http://example.com/page?foo=bar"

Если вы хотите вернуть только сам атрибут, вам нужно будет сделать

//a[contains(@href,'foo')]/@href

Обратите внимание, что в SimpleXml это вернет элемент SimpleXml:

array(1) {
  [0]=>
  object(SimpleXMLElement)#3 (1) {
    ["@attributes"]=>
    array(1) {
      ["href"]=>
      string(31) "http://example.com/page?foo=bar"
    }
  }
}

но вы можете вывести URL-адрес сейчас

echo $list[0] // gives "http://example.com/page?foo=bar"
person Gordon    schedule 06.03.2010
comment
это то, что я имел в виду. Только мой html-документ не работает при использовании SimpleXML. Однако запрос xpath работает, и его использование с DomXpath дает мне то, что я хочу. Спасибо! - person MattW; 06.03.2010