2012-03-07 173 views
1

我正在嘗試爲php html dom創建一些元素路徑模式。PHP DOM html從另一個元素獲取元素

它看起來像休閒。我可以有不同的路徑,我想要一些文本。喜歡;

$elements = 'h1;span;'; 
$elements = 'div.test;h2;span'; 

我試圖創建一個函數來處理這些插入,但我被困在 部分的良好秩序設置「的getElementsByTagName()」和接收的 最後一個元素的值,

我現在所做的事情;

function convertName($html, $elements) { 

     $elements = explode(';', $elements); 
     $dom = new DOMDocument; 
     $dom->loadHTML($html); 
     $name = null; 

     foreach ($elements as $element) : 
      $name. = getElementsByTagName($element)->item(0)->; 
      endforeach; 

     $test = $dom->$name.'nodeValue'; 
     print_r($test); // receive value   
    } 

我希望有人能給我一些輸入或例子。

+0

(http://schlitt.info/opensource/blog/0704_xpath。 HTML)或使用支持Selector的第三方庫,例如phpQuery或Zend_Dom – Gordon 2012-03-07 19:44:06

+0

我不想爲這個東西放一個大類的lib,我認爲必須有一個解決方案來達到這個簡單的方法:) – directory 2012-03-07 20:19:32

+0

然後學習XPath – Gordon 2012-03-07 20:26:06

回答

1

可能是這樣的:

function convertName($html, $elements) { 
    $doc = new DOMDocument(); 
    libxml_use_internal_errors(true); 
    $doc->loadHTML($html); // loads your html 
    $xpath = new DOMXPath($doc); 

    $elements = explode(';', $elements); 
    $elemValues = array(); 

    foreach ($elements as $element) { 
     $nodelist = $xpath->query("//$element"); 
     for($i=0; $i < $nodelist->length; $i++) 
     $elemValues[$element][] = $nodelist->item($i)->nodeValue; 
    } 
    return $elemValues; 
} 

// TESTING 
$html = <<< EOF 
<span class="bar">Some normal Text</span> 
<input type="hidden" name="hf" value="123"> 
<h1>Heading 1<span> span inside h1</span></h1> 
<div class='foo'>Some DIV</div> 
<span class="bold">Bold Text</span> 
<p/> 
EOF; 

$elements = 'h1;span;'; 
// replace all but last ; with/to get valid XPATH 
$elements = preg_replace('#;(?=[^;]*;)#', '/', $elements); 
// call our function 
$elemValues = convertName($html, $elements); 
print_r($elemValues); 

OUTPUT:

Array 
(
    [h1/span] => Array 
     (
      [0] => span inside h1 
     ) 

) 
你想與[XPath]中熟悉
+0

它幾乎是這樣,但返回是分開的,這個將給所有文件中找到的結果。當$元素是'h1; span'時,這意味着我只想將nodeValue從'h1'中的'span'中取出。 – directory 2012-03-07 20:15:14

+0

通過xpath找到解決方案!謝謝大家! – directory 2012-03-07 20:35:48

+0

你是說'h1; span'是你的版本XPATH到h1內部的跨度?如果是這種情況,上面的代碼很容易被調整。請參閱我的更新。 – anubhava 2012-03-07 20:42:28