一部のHTMLタグを通すフィルタ
Posted feedbacks - Ruby
CGI.escapeElementが使えるかなと思ったが微妙に要求が異なる
1 2 3 4 5 6 7 8 9 10 11 12 13 | def filter(html)
html.gsub(%r!<((/?)([a-z]+)[^>/]*(/?)>)!i){
rest, endtagp, tagname, slash = Regexp.last_match.captures
case tagname
when "br", "BR", "strong", "STRONG"
"<#{endtagp}#{tagname}#{slash}>"
when "a", "A"
endtagp.empty? ? "<a #{$&.scan(/(?:href|name)=(?:".+?"|'.+?'|[^ >]+)/).join ' '}>" : '</a>'
else
"<#{rest}"
end
}
end
|
修正。
1 2 3 4 5 6 7 8 9 10 11 12 13 | def filter(html)
html.gsub(%r!<((/?)([a-z]+)[^>/]*(/?)>)!i){
rest, endslash, tagname, slash = Regexp.last_match.captures
case tagname.downcase
when "br", "strong"
"<#{endslash}#{tagname}#{slash}>"
when "a"
endslash.empty? ? "<a #{$&.scan(/(?:href|name)=(?:".+?"|'.+?'|[^ >]+)/i).join ' '}>" : '</a>'
else
"<#{rest}"
end
}
end
|




にしお
#3410()
Rating0/0=0.00
このお題はperezvonさんの提案を元にしています。ありがとうございました。 ただ、いきなりだと難しいかと思ったので、肝の部分以外を先に出題しました。このお題は続編で徐々に難しくなっていきます。
追記:属性に<や>が含まれてしまうケースに漏れのある解答が多いようなのでテストケースを追加します。 これは「この出力なら十分」という意味です。この出力の通りでなければいけないという意味ではありません。 <script foo="<script>alert('bar')</script>">alert('foo')</script> <script foo="<script>alert('bar')</script>">alert('foo')</script> <script foo="<a href='link'>link</a>">alert('foo')</script> <script foo="<a href='link'>link</a>">alert('foo')</script> <a href='www.g>oogle.com'>link</a> <a href="./www.g%3Eoogle.com">link</a>[ reply ]