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"
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