2009-07-30 89 views
0

問候元素!正則表達式,以提取類名

我有一些HTML,可能會或可能不會是有效的。如果HTML是無效的,最好則可以嘗試,而產生的任何錯誤都可以接受(即分組太多,因爲有些標籤沒有正確關閉)。

在該HTML是多種元素,其中一些可具有類(稱之爲「findme」)的。這些元素是不同類型的;一些IMG,一些對象,一些一個

我需要一個正則表達式,將拔出的所有元素,與內容所包含是否含有內容。

例如:

<div> 
<span><img class="findme" src="something" /></span> 
<object class="findme" classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"> 
    <param name="BorderStyle" value="1" /> 
    <param name="MousePointer" value="0" /> 
    <param name="Enabled" value="1" /> 
    <param name="Min" value="0" /> 
    <param name="Max" value="10" /> 
</object> 
</div> 

運行在HTML的是大塊的正則表達式應該返回2個元素:

<img class="findme" src="something" /> 

<object class="findme" classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"> 
     <param name="BorderStyle" value="1" /> 
     <param name="MousePointer" value="0" /> 
     <param name="Enabled" value="1" /> 
     <param name="Min" value="0" /> 
     <param name="Max" value="10" /> 
    </object> 

你的任何正則表達式大師在那裏有關於這個的一個想法?

編輯: 的語言是C#。

+0

能否請您指定要使用這個工作的編程語言? – 2009-07-30 14:15:51

回答

4

雖然正則表達式可以適用於各種各樣的任務,但我發現它在解析HTML DOM時通常很短。HTML的問題在於,您的文檔結構變化太大,以至於很難準確(並且準確地說,我的意思是100%的成功率,並且沒有誤報)提取標籤。

我建議你做什麼是使用DOM解析器如SimpleHTML,並用它作爲這樣的:

require_once('SimpleHTML.class.php') 

$html_dom = str_get_dom($html); 
$tags = $html_dom->find('img.findme'); // Get all img elements of class findme 

有些人可能認爲這是矯枉過正,但最終,它會更容易維護,也允許更多的可擴展性。例如,使用DOM解析器,我也可以得到alt屬性。

可以設計一個正則表達式來實現相同的目標,但會受到限制,使得它會強制alt屬性位於src之後或相反,並且克服此限制會增加常規表達。

另外,考慮下。要使用正則表達式正確匹配<img>標籤,並只得到class屬性(第2組拍攝的),你需要以下的正則表達式:

<\s*img\s+[^>]*?\s*class\s*=\s*(["'])((\\?+.)*?)\1[^>]*?> 

再然後,上面都可能失敗:

  • 屬性或標記名稱是在首都和不使用i修改。
  • 報價繞不class屬性使用。
  • 另一個屬性然後class使用>字符某處自己的價值。
  • 我沒有預見到一些其他的原因。

所以再說一遍,根本就不用正則表達式來解析一個dom文件。

+0

夠公平的。以前的要求要簡單得多,所以正則表達式工作得很好,但我認爲你是對的,這是超出正則表達式的聯盟。 – jvenema 2009-07-30 14:33:45

2

正則表達式是這項工作的極端貧困的工具。使用解析器。在你做之前,通過HTML Tidy運行它來修復無效的HTML。無論你使用什麼語言(你不會說)都會有一個或多個HTML解析器可用。

0

ÿ您不要提及您使用的是哪種語言,但您應該將其加載到XmlDocument中並正確地搜索DOM。正則表達式會進行模式匹配,但您可能會得到各種誤報。

+0

一個例子值得+1。 – Shanimal 2015-07-15 18:20:30

0

試圖用正則表達式來解決這類問題是一種災難的方法。如果您在服務器上工作,請使用容錯html解析器(即.hpricot for ruby​​)解析代碼片段並針對dom進行驗證。 在el.innerHTML =「...」上可以完成相同的操作。