2009-07-30 14 views
0

ご挨拶!クラス名で要素を抽出する正規表現

私はいくつかのHTMLが有効かどうかを確認しています。 HTMLが無効な場合は、最善の試みが行われ、発生したエラーは許容されます(つまり、一部のタグが正しく閉じられていないためにグループ分けが多すぎる)。

このHTMLにはさまざまな要素がありますが、その中にはクラスがあるものがあります(「findme」と呼ばれます)。これらの要素はさまざまな種類のものです。など、いくつかのIMG、いくつかオブジェクト、いくつか

私はすべての要素を引き出します正規表現、そして、彼らはコンテンツが含まれている場合は、それらに含まれるコンテンツを必要としています。例えば

:持っているそこのあなたの任意の正規表現達人

<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> 

<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つの要素を返す必要がありますこのアイデアは?

編集: 言語はC#です。

+0

このジョブで使用しているプログラミング言語を教えてください。 –

答えて

4

正規表現は多種多様なタスクに適していますが、HTML DOMを解析するときに通常は不足しています。HTMLの問題は、文書の構造が可変であり、正確には難しい(正確には、偽陽性のない100%の成功率を意味する)タグを抽出することです。私はあなたがお勧め何

は、SimpleHTMLとしてDOMパーサーを使用し、そのように使用している:

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>タグに一致するようにして(グループ2でキャプチャ)のみclass属性を取得するには、次の正規表現が必要です。

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

そしてを再び、上記の場合に失敗することができます

  • 属性またはタグ名が大文字で、修飾子が使用されていません。i
  • class属性の周囲には引用符は使用されていません。
  • もう1つの属性classは、その値のどこかに>文字を使用します。
  • 私は予見していないいくつかの他の理由。

再び、正規表現を使用してdomドキュメントを解析しないでください。

+0

十分に公正です。以前は要件がはるかに単純だったので、正規表現は正常に動作しましたが、あなたが正しいと思う、これは正規表現のリーグ外です。 – jvenema

2

正規表現はこの仕事にとって非常に貧弱なツールです。パーサーを使用します。そして、その前に、HTML Tidyを使って無効なHTMLを修正してください。使用している言語(使用していない)があれば、1つ以上のHTMLパーサーを使用できます。生regex操作で直接これを解決しようとするのではなく

0

Yどの言語を使用しているかは言及していませんが、これをXmlDocumentにロードしてDOMを適切に検索する必要があります。正規表現はパターンマッチしますが、あらゆる種類の誤検出を得ることができます。

+0

例は+1に値するでしょう。 – Shanimal

0

このような正規表現の問題を解決しようとするのは、desasterのレシピです。サーバーで作業している場合は、フォールトトレランスのhtmlパーサー(つまり、rubyのhpricot)でスニペットを解析し、domに対して検証します。 el.innerHTML = "..."でクライアントでも同じことができます