2010-03-06 16 views
16

PHP Xpath के साथ काम करना एक HTML पृष्ठ के भीतर कुछ लिंक खींचने की कोशिश कर रहा है।PHP एक्सपैथ: सभी href मान प्राप्त करें जिनमें सुई

निम्नलिखित mypage.html पर सभी href लिंक मिलेगा: $nodes = $x->query("//a[@href]");

जबकि निम्नलिखित सभी href लिंक मिलेगा जहां वर्णन से मेल खाता है मेरी सुई: $nodes = $x->query("//a[contains(@href,'click me')]");

क्या मैं कोशिश कर रहा हूँ प्राप्त करना स्वयं href पर मेल खाता है, कुछ विशिष्ट पैरामीटर को खोजने में अधिक विशिष्ट खोज। क्या यह एक्सपैथ क्वेरी के भीतर संभव है या क्या मुझे पहले एक्सपैथ क्वेरी से आउटपुट में हेरफेर करना शुरू करना चाहिए?

+0

हां, लेकिन 'सुई' के लिए खोज * $ node-> nodeValue(); * में वांछित * http: //example.com? Param = सुई * ...? – MattW

उत्तर

35

सुनिश्चित नहीं है कि मैं सही तरीके से प्रश्न समझता हूं, लेकिन दूसरी XPath अभिव्यक्ति पहले से ही जो आप वर्णन कर रहे हैं वह करता है। यह एक तत्व का पाठ नोड के खिलाफ मेल नहीं खाती है, लेकिन 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 युक्त href के साथ ही एक तत्व शामिल foo (जो मैं समझता हूं वह है जिसे आप ढूंढ रहे हैं)। यह पूरे तत्व का उल्लंघन करता है, क्योंकि XPath पर अनुवाद करता है, सभी गुणों को प्राप्त करें जिनमें 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" 
    } 
    } 
} 

लेकिन आप

echo $list[0] // gives "http://example.com/page?foo=bar" 
द्वारा उत्पादन यूआरएल अब कर सकते हैं
+0

मेरा यही मतलब था। SimpleXML का उपयोग करते समय केवल मेरा HTML दस्तावेज़ विफल रहता है। Xpath क्वेरी हालांकि काम करती है, और डोमक्सपाथ के साथ इसका उपयोग करके मुझे वह चाहिए जो मैं चाहता हूं। धन्यवाद! – MattW

संबंधित मुद्दे