2011-07-07 8 views
3

私はすべてのJavaScriptsタグをHTML文字列から削除する方法を探しています。正規表現に続き例外を伴うすべてのJavaScriptを削除するPHP正規表現

正常に動作しますが、私は例外を追加したいと思います:

$html = preg_replace('#<script[^>]*>.*?</script>#is', '', $html); 

どのように私はタイプtext/htmlののスクリプトは無視なっているルールを追加することができますか?

<script type="text/html" ... > ... </script> 

ご提案がありますか?

ありがとうございます。

+3

regexの代わりにHTMLパーサーを使用してください:http://php.net/manual/en/book.dom.php – PeeHaa

+0

私はとにかくやっています。 Zend_Dom_Queryを使用してください。 xpathのセレクタがどのように見えるか考えましたか? – Mayko

+0

'preg_replace'は正規表現に' e'フラグを指定して、置換文字列がコードとして扱われるようにしません。 'type =" text/html "を探して、それがあればscriptタグ全体を返し、そうでなければ空白を返す置き換え式でそれを使うことはできません。 –

答えて

3

あなたは信頼されていないHTMLをサニタイズしようとしないかもしれませんが、この質問の読者は間違った考えを取得しないだけので:<img src=bogus onerror=alert(42)>

これは<script>要素の外にはJavaScriptが削除されません。

難読化されていないスクリプト:<script>alert(42)</script >は削除されません。

無効なコンテンツをスクリプト:<scrip<script></script>t>alert(42)</script>に変換します。

私はこれがあなたがやろうとしていることではありません。信頼できない入力に関係なく、これを行うには完全に良い理由があるかもしれませんが、後の読者にとっては、正規表現だけで独自のHTML消毒剤を動かさないようにしてください。

$html = preg_replace('#<script.*</script>#is', '', $html); 

これは(貪欲)すべてのスクリプトタグと一致する必要があります:

+0

良いコメントとあなたが正しいですが、正直言って、それについてもあまり心配していません。 ;) 私はインラインスクリプトを削除しようとしていません。その例外についての詳細。 – Mayko

1

はそうのように、マイクのポインタに落ちることはありません貪欲なマッチを使用してください。例外として、私はそれを行う方法がわかりません、申し訳ありません。

+0

この正規表現は機能しません。エスケープするか区切り文字を変更する必要があります。 –

+0

ページの先頭と末尾の両方にスクリプトタグがある場合、この正規表現はページ全体をかなり削除します。 – mikel

+0

それはうまく設計されていないページです。 –

関連する問題