2009-06-03 6 views
2

次のことを行うには正規表現が必要です(残念ながら、正規表現でなければなりません)。Regexは、src値の条件付きですべてのイメージhtmlタグを選択します

イメージタグにクラス属性が含まれていないhtmlのチャンク内のすべてのイメージタグを選択するか、クラス属性が含まれている場合はその属性に先頭に特定の文字列が含まれないようにしたいとします。基本的には、特定のクラスが適用されているイメージのHTML以外の部分から、すべてのイメージタグを削除(マッチング)します。

これは2つの別個の正規表現にすることができます。

たとえば、私が保持したいクラスはPrettyと言いましょう。

私は正規表現がマッチしたい

:、

<img src="xx"/> 
<img border="x" src="xx"/> 
<img whatever other attributes src="xx"/> 
<img class="ugly" src="xx"/> 
<img whatever other attributes class="fugly" src="xx"/> 

をしかし、それは、クラス属性を持たないすべての画像タグを一致させるために(1つの正規表現でいずれかを実行する方が簡単ならない

<img class="Pretty" src="xx"/> 
<img whatever other attributes class="Pretty" src="xx"/> 
<img class="Pretty subpretty" src="xx"/> 

と一致し、 1つはクラスの属性に「きれいでない」と一致するもの)ですが、それはまったく問題ありません。それはそれは何だと

+0

class属性(もしあれば)がsrc属性の前に常にあることを保証できますか? – laalto

+2

この購入した製品は、正規表現でいくつかのhtmlソースをmangleするためのインターフェイスを提供しますが、htmlを抽出して単純なパーサーを使用することはできません。 – Svante

+0

@myself:この情報は本当に必要ではありません。質問のタイトルの後にsrc属性を考えていましたが、質問自体には何も必要ありません。 – laalto

答えて

8

使用XPath代わりに、のために:

//img[not(contains(@class,'Pretty'))] 

このXPath式は、そのclass属性文字列'Pretty'が含まれていないすべてのimgの要素を探します。私はそれがclass属性が欠けている要素のために働くと思います。

正規表現でXMLとHTMLを解析することは、通常非常に悪い考えです。もちろん、XPathは問題のHTMLが厳密な場合にのみ機能します。それが有効なXML文書でない場合、デフォルトに戻すことができますが、それでも正規表現はジョブの正しいツールではありません。

補足:私は30分でこれに戻るのが間違っていました。何かが現れ、私はそれを整理する時間がありません。ビット間に合わせ

//img[(not(@class)) or (not(contains(@class,'Pretty')))] 
+0

+1 XPathは、HTML Agility Packなどのパッケージを使用して有効でないXMLでも使用できます。 – Dror

+0

XPathでは、 'not()'は関数であり、演算子ではありません。あなたはカッコを追加/修正する必要があります。 http://www.w3.org/TR/xpath.html#function-not –

+0

@Ben:ヘッドアップに感謝します。 – Welbog

2

が、それは動作します:それはclass属性を欠いている要素に対して動作しない場合は、次の式を使用し

/(?!<img\b[^>]+\bclass="?[^>"]*\bPretty\b)<img\b[^>]*>/ 

仕組み:

<img\b[^>]+\bclass="?[^>"]*\bPretty\bはすべて「美しい」画像に一致します。

<img\b[^>]*>すべての画像に一致します。そのため、「Pretty」画像サブパターンをサブパターンの前のネガティブな先読みに入れて、すべての画像に一致させます。これは、すべてのイメージから、かなりのサブパターンに一致するイメージを除いたものになります。

1
あなたの質問に答えるように見える
<img(?:\s+(?:(?!class\b)\w+="[^"]*"|class="(?!Pretty)[^"]*"))*/> 

、しかし、のようなあなたが対応していませんでした多くの詳細がある:

  • は、タグ - であり、一貫して小文字の属性名?

  • クラス名が "pretty"で始まる場合(つまり、大文字と小文字が区別される場合)はどうなりますか?

  • 属性値は常に引用符で囲まれ、常に二重引用符で囲まれていますか?

  • 最後の "/>"の前後に余分な空白がありますか?

  • あなたの「購入ツール」は、否定的な先読みで正規表現をサポートしていますか?

0

はい、私が正規表現以外のものを使う方が良いと提案した人にはもちろん正しいですが、質問の最初の文が間違っていると思います。

私は解決策を見つけることになった、ニックとアランMの外観は、それに最も近い、おかげでみんな!幸いにも私は否定的な先読みを使うことができますので、それは完全に動作します:)

関連する問題