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

Работа с PHP Xpath пытается быстро вывести определенные ссылки на странице html.

Ниже перечислены все ссылки href на mypage.html: $nodes = $x->query("//a[@href]");

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

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

Ответ 1

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

$html = <<< HTML
<ul>
    <li>
        <a href="#" onclick="location.href='http://example.com/page?foo=bar'; return false;">Description</a>
    </li>
    <li>
        <a href="#" onclick="location.href='http://example.com/page?lang=de'; return false;">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 преобразует в Fetch все элементы 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"