2008-09-04 18 views
26

リンクを除いてすべてのHTMLを削除する正規表現を作成しようとしています(<a hrefタグと</a>タグです)、100%安全である必要はありません(私は注射について心配していません攻撃か何か私は)すでにSWFムービーに承認され、公開されているコンテンツを解析していて。リンクを除くすべてのHTMLタグを削除します

私が使用しているオリジナルの「ストリップタグ」正規表現は<(.|\n)+?>だった、と私は<([^a]|\n)+?>にそれを修正しようとしましたが、当然のことながら、先頭に空白を入れたものではなく、のタグを持つことができます。

それは本当に重要なことではありませんが、誰でも気にしている場合は、これはFlash映画のためにActionScript 3.0に書いてあります。

答えて

26
<(?!\/?a(?=>|\s.*>))\/?.*?> 

これを試してください。 pタグについても同様のことがありました。彼らのために働いたので、なぜ見ていない。否定先読みを使用して、a(オプションの/文字で始まる)と一致しないかどうかをチェックします(オプションの/プレフィックスを含む)にa>またはスペース、stuff、>が続きます。これは次の>文字まで一致します。これは私がそれについて起こっておくが、私はあまりにも頻繁にregexrをお勧めすることができます方法はありません唯一の開口部とタグ

+0

を削除します... – Geremia

1

を閉じておきます

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g; 

でSUBSTでこれを入れてください。このタイプのものをテストするのは素晴らしいことです。

1

一般に、このアプローチには問題があります。正規表現は「フラットな」テキストマッチングに最適です。ネストされたデータは正規表現エンジンを設計されていない領域にプッシュします。一般的なHTML解析では、正規表現エンジンではなくパーサが必要です(技術的な詳細を知りたい場合は、正規表現と文脈自由言語の違いについてはGoogleを参照してください)。

/< /と/ >/を空の文字列またはそのエンティティに置き換えると、簡単にすべてのタグを取り除くことができますが、正規表現を使用してHTMLを選択的にフィルタリングすると、偶発的または悪意のある入力が広範囲に及ぶ可能性があります。ここで

0

あなたが行く:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>} 
-2

strip_tags()はこれを行います。ここで

、私はすべての<a><p><font><b><i><sup>タグを含むと片付けたバージョンを出力しています:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm 
関連する問題