2007年11月23日金曜日

FirefoxのURI属性値における数値参照の解釈がおかしい

2chスレッド Proxomitron フィルター作成スレッド Part7 の書き込みを見て、気がついたFirefoxの動作メモです。

36 :名無しさん@お腹いっぱい。 < sage > :2007/11/02(金) 00:37:16 ID:l+Xvx/fa0
URIを「 &#十進数; 」の羅列で表記して隠してるページがあるんだけど
どうやったら普通の文字に変換できますか?
「 %十六進数 」は>>834みたいにすればいいのは解るんですが。

多分、数値参照文字を書くときに & までエスケープ (&amp;) して、数値参照表記を表示させているのだと思います。
この場合、ソースは以下のようなものが考えられます。
# リンクまで変なのは、不特定多数の掲示板に投稿された場合を考慮しての事。

<a href='http://prx.testing.com?test=&amp;#80;&amp;#114;&amp;#111;&amp;#120;&amp;#111;&amp;#109;&amp;#105;&amp;#116;&amp;#114;&amp;#111;&amp;#110;'>
http://prx.testing.com?test=&amp;#80;&amp;#114;&amp;#111;&amp;#120;&amp;#111;&amp;#109;&amp;#105;&amp;#116;&amp;#114;&amp;#111;&amp;#110;'>
<a>

こうなると、数値参照で使われているアンバサンド (&) がエスケープされているため、数値参照としては機能しない「はず」です。
が、Firefox 2.0.0.9 で動作確認をすると、内部動作で「 &amp;#十進数; 」と同等に解釈されるのか、正常なリンクとして機能してしまいます。
IE7 はエスケープ前の「 &amp;amp;#十進数; 」として解釈するため、不正なリンクとして動作します。
これはIE7の解釈の方が正しい気がするのですが……。

IE7で正常なリンクとして扱われるためには、&amp; を & に変換して、本来の数値参照に直す必要があります。
以下は、a要素のhref属性値限定で &amp;& に置換するProxomitronのフィルタです。

[Patterns]
Name = "&#n; to char for URL Link [2007/11/23] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(<a\s[^>]++href=)\#$AVQ(((*\&)\#amp;(#[#0:9999];)\#)+{1,*}\#)(^(^[ >]))"
Replace = "\@"

リンクが貼られていない文字列を置換するなら、URLテキストをリンク化するフィルタ http Text to Link で上のフィルタと同じことを行えば、実現できると思います。

ラベル: , , ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム