2010-10-20 49 views
2

我討厭寫下很多CSS規則,然後在其中輸入我的樣式,所以我想開發一個小php腳本來解析我會傳遞給它的HTML,然後返回空的CSS規則。解析HTML以從PHP返回來自ID和類屬性的CSS規則

我決定使用PHP的DomDocument。

問題是:我怎麼能夠遍歷整個結構? (我看見例如的DomDocument只有getElementByTag或的getElementById並沒有getFirstElement例如)

我只想要得到的ID和階級的HTML代碼給定塊,我想傳遞的東西,如:

<div id="testId"> 
    <div class="testClass"> 
     <span class="message error">hello world</span> 
    </div> 
</div> 

我只想知道我該如何循環遍歷每個節點?

謝謝!

+4

這將是一個**很多選擇器。有多種方式來描述大多數元素(以不同的方式重疊)。真正不太可能的是,一個可能會選擇多個選擇器的工具會輸出足夠多的你想要或不想要的東西。 – Quentin 2010-10-20 13:43:37

+0

XML工具(例如PHP的DOM)僅適用於您可以依賴格式良好的文檔。一般來說,HTML和XML對於這種解析是不兼容的。 – nnevala 2010-10-20 14:55:19

+0

大衛是對的。如果你想要所有可能的選擇器,這將是一個龐大的數字。也許你想要的只是具有class或id的東西的選擇器?你能提供你想要的樣本輸入和輸出嗎? – 2010-10-20 14:57:58

回答

2

SimpleXML擴展爲PHP可以幫助你。它完美地瀏覽HTML樹。

http://www.php.net/manual/en/simplexml.examples-basic.php

+0

OMG!我永遠不會那麼簡單!我的意思是:我所做的只是新的SimpleXMLElement($ source),它向我返回了一個完整的數組,其中包含我需要的一切! 「我們有一個情況!」 Thx爲此! – TomShreds 2010-10-20 15:34:41

3

你可以傳遞一個星號(*),以getElementsByTagName通過他們得到的所有標籤,然後循環...

<?php 

$nodes = $xml->getElementsByTagName("*"); 
$css = ""; 

for ($i = 0; $i < $nodes->length; $i ++) 
{ 
    $node = $nodes->item($i);  
    if ($node->hasAttribute("class")) { 
     $css = $css . "." . $node->getAttribute("class") . " { }\n"; 
    } elseif ($node->hasAttribute("id")) { 
     $css = $css . "#" . $node->getAttribute("id") . " { }\n"; 
    } 
} 

echo $css; 

?> 
+0

第一:非常感謝!這正是我期待的!到目前爲止,它沒有與我在問題中提供的HTML示例一起工作,但我想我應該在它周圍包裝一個HTML標頭,以便它可以兼容XML .. – TomShreds 2010-10-20 15:15:33

+0

@Tom我更新了答案,它現在應該是一個完整的解決方案 – 2010-10-20 15:19:43

+0

@Tom這是未經測試的,我不知道PHP! OMG! – 2010-10-20 15:20:16