私は数日間オンとオフになっていましたが、私のRexExの熟練はあまり良くありません。はい、私はRegExがHTMLを解析するのではないことを理解しています。私はCKEditor入力のサーバー側の "クリーニング"を行っていますが、これは既にこれを行いますが、クライアント側のみです。いずれもホワイトリストされたタグをストライピングした後イベント属性を見つけて削除するRegEx ex。 onclick、onload、onhoverなど
...
まず:$html = preg_replace(' on\w+=(["\'])[^\1]*?\1', '', $html);
すべてのイベントが正しく'
または"
のいずれかの重引用符で引用された属性
$html = preg_replace(' on\w+=\S+', '', $html);
*何の引用符を持っていないものを削除しかし、まだ発射することができます。 onclickの= blowUpTheBaseは()私がやりたい何
はのonEventが>
& <
の間にあるが、私は唯一のonEvent属性はタグの後の最初の1であれば、それは仕事を得ることができ確実です。私が試したすべてが、ほとんどのコードをキャプチャしてしまいます。私はちょうど十分に怠惰なそれを得ることができません。
ex。 $html = preg_replace('<([\s\S]?)(on\w+=\S+) ([\s\S]*?)>', '<$1 $3>', $html);
編集: RegExは私が求めているので、@ colburtonの回答を選択します。私はそれがトリックに起因するので、私の特定の状況にもそれを使用します。それは、この「正しい方法」を行う方法についての素晴らしい例と説明を与えるので、私は彼のanswerため@Casimirらイポリットに感謝したいと思います
しかし
(それはとにかく内部のアプリケーションです)。 DOMDocumentを使用して関数を書くとすぐに、RTE/WYSIWYG/HTML入力を処理するgotoの方法になります。
'[^ \ 1]'として動作しません。あなたはそれがそうだと思います。代わりに '(?:(?!\ 1)。)*'を使用する必要があります。また、正規表現のデリミタを使用する必要があります。 –
引用符問題と属性の位置は、正規表現であなたのhtmlを解析することが悪い考えである理由の2つです。 DOMDocumentを使用すると、これらの問題は存在しません。あなたのHTMLコンテンツを偽のルート要素に囲み、 '
外部データを信頼できないことに注意してください。すでにクライアント側で処理されるはずのクリーニングの部分がある場合は、もう一度サーバー側で行うか、少なくともチェックする必要があります。 –