2011-02-09 11 views
0

私は現在、HTMLをインポートしてプレーンテキストに変換するperlスクリプトを持っています。私はHTML :: TagFilterを使ってすべてのHTMLタグを削除していますが、私たちが1つの問題に遭遇した場合を除き、ほぼ完全に動作しています。 HTMLが含まれている場合など、これらのタグ以下の例の入力で「キャプション」などの非スタンドHTMLタグが削除されていない:私は助けを必要と何テキスト入力を処理するPerl正規表現

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam pulvinar, odio ut gravida fringilla, tellus mi ultrices felis, quis porta lacus sem ut lacus. Vestibulum massa justo, tristique id aliquet in, dapibus eu leo. Nam sapien risus, dictum et porttitor quis, egestas quis dui. Ut nec nisl felis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 

[caption id="sample-id" align="sample-align" width="225" caption="Sample Caption"]<a href="http://www.domain.com/image.jpg"><img class="sample-image-class" title="Sample Title" src="http://www.domain.com/image.jpg" alt="Sample Alt" width="225" height="300" /></a>[/caption] 

In hac habitasse platea dictumst. Duis imperdiet bibendum dolor ut ullamcorper. Suspendisse dui erat, facilisis sed aliquet non, elementum eu urna. Donec non nisi vel augue gravida imperdiet sed id tortor. Maecenas ullamcorper velit non dui imperdiet hendrerit. 

は完全にこのコンテンツを削除するための簡単なPerlの正規表現であります。私はさまざまなアプローチを試みましたが、何も動作していないようです。私はそれが優れている誰かのために簡単な運動です願ってい

$text =~ s/[(\w)+](.*)[\/(\w)+]//g; 

:私が探しているブラケットを使用して、非標準のHTMLタグのすべての出現を検索し、削除します以下のようなもの[]であります私よりも正規表現で。

ご協力いただきありがとうございます。

+0

私は 'HTML :: TagFilter'を知らないので、これは正直な質問ですが、あなただけの' $自己> deny_tags() 'と' caption'を追加することはできませんか? – CanSpice

+0

@CanSpice - 残念ながら、deny_tags()は<> not []を使用する標準のHTML形式のタグのみをサポートしているので動作しません。 –

+0

ああ、そうだ。実際にはHTMLではなく、HTMLのように見えるが、<>の代​​わりに[]を使うマークアップタグです。 – CanSpice

答えて

2

大括弧は、正規表現内で特別な意味を持つため、エスケープする必要があります。すべての属性が二重引用符で囲まれていないと仮定すると、次のように動作するはずです。

$text =~ s/\[\/?\w+(\s+\w+="[^"]*")*\s*\/?\s*\]//g; 
+0

提案をお寄せいただきありがとうございますが、残念ながら上記のサンプル入力にはうまくいかないようです。なぜそれが機能していないのか? –

+0

@Russell C .:申し訳ありませんが、私のバグ。私は[^ "*]と書いていました。これにより、自己/閉鎖の「タグ」も削除されないことに注意してください。 – btilly

+0

ありがとうございます。完璧に働いた。 –

0

あなたは他人を削除するには、角括弧と信頼のHTML :: TagFilterで唯一のものを削除するために正規表現を使用することができます。

$text =~ s! #Start match pattern (used exclamation mark instead of/for readability) 
     \[ #Left square bracket 
      [^\]]*? #Followed by any character(s) which are not ]. ? means lazy match 
     \] #Right square bracket 
     !!gx; #Replace with nothing, globally, allow comments and whitespace