2012-06-27 59 views
1

我想從網頁中提取的情侶對錶,並顯示在我的網頁ID提取,並通過它打印一個HTML元素的使用DOM文檔

我打算用正則表達式來提取它們,但後來我看到DOM文檔類 它似乎更清潔我看着在計算器,似乎所有的問題都是有關獲取內部文本或使用一個循環來獲取元素的內部節點。我想現在我怎麼能提取和打印一個HTML元素的ID。

$html = file_get_contents("www.site.com"); 
$xml = new DOMDocument(); 
$xml->loadHTML($html); 
$xpath = new DOMXPath($xml); 
$table =$xpath->query("//*[@id='myid']"); 
$table->saveHTML(); // this obviously doesn't work 

我該如何顯示或回顯$表作爲我的網頁上的實際html表?

回答

1

首先,DOMDocument有一個getElementById()方法,所以你的XPath是不必要的 - 雖然我懷疑它是如何工作的。

其次,爲了獲得標記片段,而不是整個文件,可以使用DOMNode::C41N(),使你的代碼看起來像這樣:

<?php 

    // Load the HTML into a DOMDocument 
    // Don't forget you could just pass the URL to loadHTML() 
    $html = file_get_contents("www.site.com"); 
    $dom = new DOMDocument('1.0'); 
    $dom->loadHTML($html); 

    // Get the target element 
    $element = $dom->getElementById('myid'); 

    // Get the HTML as a string 
    $string = $element->C14N(); 

看到一個working example

+0

謝謝。我有關於選擇的問題。如果我想獲得與特定ID的第一個表格,我應該怎麼做?類似$元件= $ dom->的getElementById( 'mydiv') - >則firstChild( '表'); ?? – max

+1

我會做'$元件= $ dom->的getElementById( 'mydiv') - >的getElementsByTagName( '表') - >項(0);' - 'firstChild'是一個屬性,而不是方法。如果你想表是div的第一個子元素,但'的getElementsByTagName()'是安全的,你可以使用'firstChild'。就方法名稱和機制而言,這與Javascript相同,除了PHP需要使用['item()'](http://php.net/manual/en/domnodelist.item.php)<= 5.3 ,因爲PHP直到5.4才支持[數組解引用](http://schlueters.de/blog/archives/138-Features-in-PHP-trunk-Array-dereferencing.html)。 – DaveRandom

1

您可以使用DOMElement :: C14N()來獲取DOMElement的規範化HTML(XML)表示,或者如果您想要更多控件,以便可以過濾某些元素和屬性,則可以使用類似下面的內容:

function toHTML($nodeList, $tagsToStrip=array('script','object','noscript','form','style'),$attributesToSkip=array('on*')) { 
$html = ''; 
foreach($nodeList as $subIndex => $values) { 
    if(!in_array(strtolower($values->nodeName), $tagsToStrip)) { 
     if(substr($values->nodeName,0,1) != '#') { 
      $html .= ' <'.$values->nodeName; 
      if($values->attributes) { 
       for($i=0;$values->attributes->item($i);$i++) { 
        if(!in_array(strtolower($values->attributes->item($i)->nodeName) , $attributesToSkip) && (in_array('on*',$attributesToSkip) && substr(strtolower($values->attributes->item($i)->nodeName) ,0 , 2) != 'on')) { 
         $vvv = $values->attributes->item($i)->nodeValue; 
         if(in_array(strtolower($values->attributes->item($i)->nodeName) , array('src','href'))) { 
          $vvv = resolve_href($this->url , $vvv); 
         } 
         $html .= ' '.$values->attributes->item($i)->nodeName.'="'.$vvv.'"'; 
        } 
       } 
      } 
      if(in_array(strtolower($values->nodeName), array('br','img'))) { 
       $html .= ' />'; 
      } else { 
       $html .= '> '; 
       if(!$values->firstChild) { 
        $html .= htmlspecialchars($values->textContent , ENT_COMPAT , 'UTF-8' , true); 
       } else { 
        $html .= toHTML($values->childNodes,$tagsToStrip,$attributesToSkip); 
       } 
       $html .= ' </'.$values->nodeName.'> '; 
      } 
     } elseif(substr($values->nodeName,1,1) == 't') { 
      $inner = htmlspecialchars($values->textContent , ENT_COMPAT , 'UTF-8' , true); 
      $html .= $inner; 
     } 
    } 
} 
return $html; 
} 

echo toHTML($table); 
相關問題