2

私は実際に wysihtml5 エディターの結果を安全にしようとしています。
基本的に、ユーザーは script/forms/etc タグを入力できません。

一部のタグはコンテンツを希望どおりに表示するために使用されているため、すべてのタグを削除することはできません。
(例:<h1>タイトルを表示する)

問題は、ユーザーがまだ不要なコードにバインドされた DOM イベント リスナーを追加できることです。
(例: <h1 onclick="alert('Houston, got a problem');"></h1>)

div 内のすべてのイベント リスナーを削除したいと思います (その div 内のすべての子孫に対して)。
私が実際に使用しようとした解決策は、コードを文字列としてチェックして不要なコンテンツを見つけて置き換えることで、これは不要なタグに対して機能しました。

私が実際に必要としているのは、すべてのタグ内のすべてのイベント リスナーに一致する正規表現です。
「< と > の間のすべての [on*] を選択」のようなもの。
例 :
<h1 onclick=""></h1>=> 一致する必要が
<h1 onnewevent=""></h1>ある => 一致する必要がある => 一致する
<h1>onclick=""</h1>必要がない

よろしくお願いします。

4

1 に答える 1

2

html を正規表現で解析するべきではありません。
ただし、本当にやりたい場合は、これは手早く汚い方法です
(決して完全ではありません)。

'onevent' 開始タグとその直後の終了タグを検索するだけです。
間に何か他のものがある場合は.*?、タグの間を追加してください。

 #  <([^<>\s]+)\s[^<>]*on[^<>="]+=[^<>]*></\1\s*>
 # /<([^<>\s]+)\s[^<>]*on[^<>="]+=[^<>]*><\/\1\s*>/

 < 
 ( [^<>\s]+ )                    # (1), 'Tag'
 \s 
 [^<>]* on [^<>="]+ = [^<>]*     # On... = event
 >
 </ \1 \s* >                     # Backref to 'Tag'

Perl テスト ケース

$/ = undef;

$str = <DATA>;

while ( $str =~ /<([^<>\s]+)\s[^<>]*on[^<>="]+=[^<>]*><\/\1\s*>/g )
{
    print "'$&'\n";
}


__DATA__
(eg : <h1 onclick="alert('Houston, got a problem');"></h1>) 

I would like to remove all event listeners inside a div
(for all descendants inside that div).
The solution I actually tried to use is to check the code as
a string to find and replace unwanted content,
which worked for the unwanted tags. 

What I actually need is a regex matching all event
listeners inside all tags.
Something like "select all [on*] between < and >".
Examples :
<h1 onclick=""></h1> => Should match
<h1 onnewevent=""></h1> => Should match
<h1>onclick=""</h1> => Should NOT match 

出力 >>

'<h1 onclick="alert('Houston, got a problem');"></h1>'
'<h1 onclick=""></h1>'
'<h1 onnewevent=""></h1>'
于 2014-03-18T17:01:08.330 に答える