RubyのCGI.escapeHTMLを使うと数値文字参照と文字実体参照の&もエンコードされてしまうのですが、これらをエンコードしない他のライブラリはありませんか?

http://d.hatena.ne.jp/afternoontea/20080709

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/07/15 00:39:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bonlife No.1

回答回数421ベストアンサー獲得回数75

ポイント100pt

escapeHTMLはcgi.rbの中を見ていただければ分かりますが、gsubで変換しているだけです。

正規表現の否定先読みを使い、除外したいものを指定すれば良いはずです。

def escapeHTML(string)
  string.gsub(/&(?!(?:amp|quot|lt|gt|#(?:\d+|x[0-9a-f]+));)/n, '&amp;').gsub(/\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;')
end

ちょっと正確か自信がないのですが、イメージは伝わると思い、回答いたしました。

参考にしてみてください。

id:afternoontea

ありがとうございます。少しずつ確認してみます。

#(?:\d+|x[0-9a-f]+)

・# に続く 後方参照を伴わないグループ化(10進数値文字参照形式 または 16進数値文字参照形式)

・16進数値文字参照形式は 小文字(x) または 大文字(X) を考慮する必要があるので要修正

HTML 4.01仕様

http://www.w3.org/TR/1999/REC-html401-19991224/charset.html#h-5....

http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/charset.html#h...

組み込み変数 $KCODE - "NONE" のときはマルチバイト文字列を認識しません

http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.h...

2008/07/11 03:20:41
  • id:afternoontea
    afternoontea 2008/07/11 03:41:52
    ・16進数値文字参照形式は a-f の大文字小文字を考慮しないので要修正
  • id:afternoontea
    afternoontea 2008/07/21 03:07:13
    修正したメソッドでしばらく運用してみる。
    http://d.hatena.ne.jp/afternoontea/20080709

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません