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?

18
задан MattW 6 March 2010 в 12:06
поделиться

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"
39
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: