2010-03-06 29 views
16

Làm việc với PHP Xpath cố gắng nhanh chóng kéo các liên kết nhất định trong một trang html.PHP Xpath: nhận tất cả các giá trị href có chứa kim

Sau đây sẽ tìm thấy tất cả các liên kết href trên mypage.html: $nodes = $x->query("//a[@href]");

Trong khi những điều sau đây sẽ tìm thấy tất cả các liên kết href nơi mô tả phù hợp kim của tôi: $nodes = $x->query("//a[contains(@href,'click me')]");

Những gì tôi đang cố gắng để đạt được là phù hợp trên bản thân href, cụ thể hơn tìm kiếm của url có chứa các thông số nhất định. Có thể đó trong một truy vấn Xpath hay tôi nên bắt đầu thao tác đầu ra từ truy vấn Xpath đầu tiên?

+0

Có, nhưng tìm kiếm 'kim' trả về phần văn bản trong * $ node-> nodeValue(); * và không phải là mong muốn * http: //example.com? Param = needle * ...? – MattW

Trả lời

35

Không chắc chắn tôi hiểu đúng câu hỏi, nhưng biểu thức XPath thứ hai đã thực hiện những gì bạn mô tả. Nó không phù hợp với các nút văn bản của phần tử A, nhưng thuộc tính 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')]"); 

Đầu ra:

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

Như bạn có thể thấy, NodeList trở chỉ chứa A phần tử với href chứa foo (mà tôi hiểu là những gì bạn đang tìm kiếm). Nó bao gồm toàn bộ phần tử, vì XPath dịch thành Tìm nạp tất cả các phần tử A có thuộc tính href chứa foo. Sau đó bạn sẽ truy cập vào thuộc tính với

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

Nếu bạn chỉ muốn trả lại thuộc tính riêng của mình, bạn phải làm

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

Lưu ý rằng trong SimpleXML, điều này sẽ trả về một yếu tố SimpleXML mặc dù:

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

nhưng bạn có thể xuất URL bây giờ bằng cách

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

đó là ý tôi. Chỉ tài liệu html của tôi không thành công khi sử dụng SimpleXML. Các truy vấn xpath hoạt động mặc dù, và sử dụng nó với DomXpath mang lại cho tôi những gì tôi muốn. Cảm ơn! – MattW

Các vấn đề liên quan