PHP XPath: iğne içeren tüm href değerleri almak

1 Cevap php

Hızlı bir şekilde html sayfası içinde belirli bağlantılar çekmeye çalışıyor PHP XPath ile çalışma.

The following will find all href links on mypage.html: $nodes = $x->query("//a[@href]");

Whereas the following will find all href links where the description matches my needle: $nodes = $x->query("//a[contains(@href,'click me')]");

Ne elde etmek çalışıyorum href kendisi eşleştirme, belirli parametreleri içeren daha spesifik bir bulgudur url. Olası bir XPath sorgusu içinde veya ben sadece ilk XPath sorgudan çıktı manipüle başlamak gerektiğidir?

1 Cevap

Emin değilim doğru soruyu anlamak, ancak ikinci XPath ifadesi zaten açıklayan yapar. Bu bir elemanın metin düğümü, ama href özniteliği karşı eşleşmiyor:

$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')]");

Çıkışlar:

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

Gördüğünüz gibi, iade NodeList href içeren foo (Ben aradığınız ne olduğunu anlamak olan) yalnızca bir öğesi içeriyor. XPath Fetch all A elements with href attribute containing foo çevirir, çünkü tüm öğeyi contans. Daha sonra birlikte öznitelik erişmeye olur

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

Sadece nitelik kendisi döndürmek istiyorsanız, yapmanız gerekiyor

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

SimpleXMLElement, bu olsa XML elemanına döneceğini unutmayın:

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

ama sen tarafından şimdi çıktı URL'yi can

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