2011-02-25 39 views
5

Trong lớp DOMDocument có các phương thức để lấy các phần tử theo id và theo tên thẻ (getElementById & getElementsByTagName) nhưng không phải theo lớp. Có cách nào để làm việc này không?Sử dụng DOMDocument để trích xuất từ ​​tài liệu HTML theo lớp

Ví dụ: làm cách nào để chọn div từ đánh dấu sau?

<html> 
... 
<body> 
... 
<div class="foo"> 
... 
</div> 
... 
</body> 
</html> 
+0

thể trùng lặp của [DOMDocument cần tìm kiếm một phần tử có thuộc tính class = "something"] (http://stackoverflow.com/questions/3443701/domdocument-need-to-search-for-an-element-that-has-attribute-class-something) – mario

Trả lời

11

Câu trả lời đơn giản là sử dụng xpath:

$dom = new DomDocument(); 
$dom->loadHtml($html); 
$xpath = new DomXpath($dom); 
$div = $xpath->query('//*[@class="foo"]')->item(0); 

Nhưng điều đó sẽ không chấp nhận không gian. Vì vậy, để chọn bởi không gian tách lớp, sử dụng truy vấn này:

//*[contains(concat(' ', normalize-space(@class), ' '), ' class ') 
+0

Câu trả lời hay. Đánh tôi đi. –

+0

Xem bảng thay thế của tôi bằng cách sử dụng bảng [contains (@class, '$ classname')] – RafaSashi

2
$html = '<html><body><div class="foo">Test</div><div class="foo">ABC</div><div class="foo">Exit</div><div class="bar"></div></body></html>'; 

$dom = new DOMDocument(); 
@$dom->loadHtml($html); 

$xpath = new DOMXPath($dom); 

$allClass = $xpath->query("//@class"); 
$allClassBar = $xpath->query("//*[@class='bar']"); 

echo "There are " . $allClass->length . " with a class attribute<br>"; 

echo "There are " . $allClassBar->length . " with a class attribute of 'bar'<br>"; 
0

Ngoài ircmaxell của trả lời nếu bạn cần phải lựa chọn bởi không gian tách lớp:

$dom = new DomDocument(); 
$dom->loadHtml($html); 
$xpath = new DomXpath($dom); 
$classname='foo'; 
$div = $xpath->query("//table[contains(@class, '$classname')]")->item(0); 
Các vấn đề liên quan