2016-09-22 31 views
1

考慮這個HTML,與任何空白或不相關的標籤,如divspan散落:解析文本和鏈接對到PHP陣列相同的順序

<div> 
<span><a href="#1">Title 1</a></span> 
<p>Paragraph 2</p> 
<p>Outside 3 
<a href="#4">Title 4</a> 
</p> 
</div> 

我怎樣才能轉化爲鏈接的PHP數組這和文本對,按照與HTML中相同的順序。

{"#1", "Title 1" }, 
{null, "Paragraph 2"}, 
{null, "Outside 3" }, 
{"#4", "Title 4" }, 

的問題是DOM本身內部3.

搜索像$html->find("a, p")將捕獲4兩次,一次有一次我不知道是否該解決方案是遍歷文件「線性」,作爲人類會從左向右閱讀元素,如果節點具有文​​本,則選擇父節點的href(如果有)。

如果這是可行的,那麼您如何輕鬆地通過DOM?有沒有人有解決方案,最好用Simple HTML DOM Parser或簡單的正則表達式,或者內置的PHP框架。

回答

1

我會看https://github.com/salathe/spl-examples/wiki/RecursiveDOMIterator這將幫助你recursevly遍歷dom結構。

$dom = new DOMDocument(); 
$dom->loadHTML('<html>'.$htmlString.'</html>'); // wrap your initial html in <html></html> since it has to be well-formed 
$dit = new RecursiveIteratorIterator(new RecursiveDOMIterator($dom)); 
$result = array(); 
foreach ($dit as $node) { 
    unset($r); 
    if(trim($node->nodeValue) == "" || $node->childNodes->length > 0){ // we look only non-empty last level nodes 
     continue; 
    } 
    $parent = $node->parentNode; 
    if($parent->nodeName == 'a'){ 
     $r[0] = $parent->getAttribute('href'); 
    } 
    $r[1] = $node->nodeValue; 
    $result[] = $r; 
} 
+0

當然......在同一DOM級別上從一個節點跳轉到另一個節點。我會試試這個!我認爲我的大腦已經開發出了反DOM遍歷或反向搜索的反生產規則... – forthrin

+0

我無法完全得到示例代碼的工作。無論如何,我按摩了一下這個問題,並用一個更復雜的例子和一個建議的方法更新了原文。 – forthrin

+0

所以現在元素不在同一層。更新了我的答案 –

0

我發現了一個非DOM的方法,通過思考我自己的整齊組織的例子!通過將每個標籤分成幾行,我可以輕鬆提取我想要的信息。這可能不是「正確的」,但按預期工作!

$array = preg_split("#(?=<)#", $html, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

foreach($array as $key => $item) { 
    preg_match('/>\s*(\S.*)/', $item, $m); 
    preg_match('/href="([^"]*)/', $item, $n); 
}