2013-01-14 36 views
16

Tiêu đề tổng hợp nó. Tôi đang cố truy vấn tệp HTML cho tất cả các thẻ div chứa lớp học result và không chứa lớp grid.Xpath PHP chứa lớp và không chứa lớp

<div class="result grid">skip this div</div> 
<div class="result">grab this one</div> 

Cảm ơn!

+0

tôi đã không cố gắng rất nhiều, chỉ // div [contains (@class, 'result') và không chứa (@class, 'grid')] và // div [contains (@class, 'result')] [không chứa (@class, 'grid')] nhưng rất rõ ràng rằng cú pháp của tôi đã bị tắt ngay lúc bắt đầu – Rob

Trả lời

30

này nên làm điều đó:

<? 
    $doc = new DOMDocument(); 
    $doc->loadHTMLFile('test.html'); 

    $xpath = new DOMXPath($doc); 
    $nodeList = $xpath->query("//div[contains(@class, 'result') and not(contains(@class, 'grid'))]"); 

    foreach ($nodeList as $node) { 
     echo $node->nodeName . "\n"; 
    } 
?> 
+0

Điều này cũng khớp với bất kỳ thứ gì với class = "* result" tức là "someResult". Vì vậy, bạn phải concat không gian để nó. – crush

+0

cảm ơn lời bình luận, điều đó cực kỳ hữu ích. đối với giải pháp tôi chắc chắn điều này sẽ làm việc vì vậy tôi sẽ cho tín dụng khi tôi đang ở một máy tính và đã xác minh mã. một câu hỏi cuối cùng: là một lập trình viên tương đối mới, tôi nên đi đâu để tìm giải pháp của mình? Tôi cảm thấy rằng đặt câu hỏi trên SO là lười biếng và google cung cấp tài nguyên lộn xộn. lời khuyên nào? cảm ơn một lần nữa guys – Rob

+0

HOLLY CRAP NÀY SAVED ME - Cpt Cap-locks –

7

XPath của bạn sẽ //div[contains(concat(' ', @class, ' '), ' result ') and not(contains(concat(' ', @class, ' '), ' grid '))]

+0

Đây là câu trả lời đúng cho câu hỏi này cho đến nay –

+0

câu trả lời hay nhất. hoạt động như một sự quyến rũ. – kovpack

3

Cú pháp XPath sẽ ...

//div[not(contains(@class, 'grid'))] 
Các vấn đề liên quan