2011-04-03 87 views
0

嗨, 兩個問題的DOMDocument類...php DOMDocument:在特定的ID中選擇特定的類名?

我用jQuery這樣做:

$('#wpf-wrapper .wpf-table .wpf-input').addClass('input-field'); 

我想要做同樣與DOMDocument類!如何才能做到這一點?我怎樣才能選擇這個?

第二個問題是:爲什麼這不起作用?

$dom = new SmartDOMDocument(); 
$dom->loadHTML($shortcode); 
$xpath = new DOMXPath($dom); 

$qr = $dom->getElementById('quick-reply-submit'); 
//$qr->setAttribute('class', 'btn small width480'); 
//ERROR: Call to a member function on a non-object...?? 

謝謝你的幫忙!

+0

什麼是smartdomdocument? – Gordon 2011-04-03 15:58:35

+0

它是一個非常有用的類,它擴展了DOMDocument類以獲得更好的UTF-8支持等等。 – matt 2011-04-03 16:26:20

+0

關心在[最佳解析HTML方法]中提供與該lib的鏈接的答案(http://stackoverflow.com/問題/ 3577641 /最好的方法對語法分析HTML/3577662)?不能傷害它在那裏。 – Gordon 2011-04-03 17:10:04

回答

1

您可以使用DOMXPath搜索您DOMDocument,然後遍歷查詢結果所需的值添加到class屬性,如果它不存在:

// This is the equivalent of '#wpf-wrapper .wpf-table .wpf-input' 
$expr = '//*[@id="wpf-wrapper"]//*[@class="wpf-table"]//*[@class="wpf-input"]'; 

$result = $xpath->query($expr); 
for($i = 0; $i < $result->length; ++$i) { 
    // Get the classes of each matched element 
    $classes = explode(' ', $result->item($i)->getAttribute('class')); 

    // Add "input-field" if it's not in there already 
    if(!in_array('input-field', $classes)) { 
     $classes[] = 'input-field'; 
    } 

    // Set the class attribute to the new value 
    $result->item($i)->setAttribute('class', implode(' ', $classes)); 
} 

你的「第二個問題」的代碼沒有按」因爲沒有ID爲quick-reply-submit的元素 - 沒有其他可能性。

+0

謝謝你......最後一個問題。如何在一系列選擇器中選擇標記名,例如...例如。 '$ expr ='// * [@ id =「wpf-wrapper」] // * [@ class =「wpf-table」] // * [@ tagname =「a」]';'所以我想選擇wpf-table中的所有錨點? – matt 2011-04-03 16:30:33

+0

@mathiregister:那個是'// * [@ class =「wpf-table」] // a'。查看更多的XPath語法教程,有很多很多的可能性。這裏有一個:http://zvon.org/xxl/XPathTutorial/General/examples.html – Jon 2011-04-03 16:39:59