リンクを除くすべての HTML タグを削除します
-
09-06-2019 - |
質問
リンクを除くすべての HTML を削除する正規表現を作成しようとしています ( <a href
そして </a>
それぞれタグを付けます。100% 安全である必要はありません (すでに承認され、ファイルに公開されているコンテンツを解析しているため、インジェクション攻撃などについては心配していません) SWF 映画)。
私が使用している元の「タグを取り除く」正規表現は、 <(.|\n)+?>
, 、そして私はそれを次のように修正しようとしました <([^a]|\n)+?>
, 、ただし、もちろん、 ある 最初にスペースが入っているものではなく、その中にあります。
それは本当に重要なことではありませんが、誰かが私がこれを書いていることを知りたい人のために アクションスクリプト 3.0 のために 閃光 映画。
解決
<(?!\/?a(?=>|\s.*>))\/?.*?>
これを試して。p タグにも同様のものがありました。彼らにとってはうまくいったのに、なぜそうしないのかわかりません。負の先読みを使用して、(正の先読みを使用して) a (オプションの / プレフィックスが付いている) の後に > またはスペース、スタッフ、> が続く a (オプションの / 文字がプレフィックス付き) と一致しないことを確認します。これは、次の > 文字まで一致します。これをsubstに入れてください
s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;
これにより、開始タグと終了タグのみが残されます。
他のヒント
私はそれについて続けていますが、推奨できる方法はありません 正規表現 頻繁すぎる。この種のことをテストするのに最適です。
一般に、このアプローチには問題があります。正規表現は「フラット」テキストの一致に最適です。ネストされたデータにより、正規表現エンジンが設計されていない領域に押し込まれます。一般的な HTML 解析には、正規表現エンジンではなくパーサーが必要です (完全な技術的な詳細が必要な場合は、通常の言語とコンテキストフリー言語の違いについて Google で調べてください)。
/</ と />/ を空の文字列またはそれに相当するエンティティに置き換えることですべてのタグを削除するのは簡単ですが、正規表現を使用して HTML を選択的にフィルタリングすると、さまざまな誤入力や悪意のある入力に対して脆弱になり、機能を破壊します。
どうぞ:
{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
どうでしょうか
<[^a](.|\n)+?>
?
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