From: Tietew Date: 2007-02-06T22:37:32+09:00 Subject: [ruby-dev:30292] Re: cgi.rbのunescapeHTML処理 On Tue, 6 Feb 2007 20:59:49 +0900 In article <45C86DA7.6050701@gmail.com> [[ruby-dev:30289] cgi.rbのunescapeHTML処理] Keiji Yoshimi wrote: > CGI.unescapeHTMLを使ったときにエスケープされていない&が単体で存在したときに > その直後にあるHTMLエンティティが影響を受けて変換されないようです。 : > - string.gsub(/&(.*?);/n) do > + string.gsub(/&([a-zA-Z0-9]*?);/n) do これだと とか とかが unescape されなくなってまずい と思います。 というか & とかはinvalid なので本当はこんな感じじゃないかな あ。 Index: lib/cgi.rb =================================================================== --- lib/cgi.rb (リビジョン 11573) +++ lib/cgi.rb (作業コピー) @@ -367,13 +367,13 @@ # CGI::unescapeHTML("Usage: foo "bar" <baz>") # # => "Usage: foo \"bar\" " def CGI::unescapeHTML(string) - string.gsub(/&(.*?);/n) do + string.gsub(/&(amp|quot|gt|lt|\#[0-9]+|\#x[0-9A-Fa-f]+);/n) do match = $1.dup case match - when /\Aamp\z/ni then '&' - when /\Aquot\z/ni then '"' - when /\Agt\z/ni then '>' - when /\Alt\z/ni then '<' + when 'amp' then '&' + when 'quot' then '"' + when 'gt' then '>' + when 'lt' then '<' when /\A#0*(\d+)\z/n then if Integer($1) < 256 Integer($1).chr —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA