&コワイ

今日も今日とてHTMLScrapingのサンプルスクリプトHTMLToFeed.class.phpです。


前々回、元にするデータに"&"が入っていたため、Warningを吐いてしまった問題について書きました。
その時はデータに問題があるから、と決めつけて半角の&を全角の&に変換してしのいだわけです。

しかし、$item->title(RSSのタイトルをつっこむ箇所)はそれでよくても、$item->link(RSSのURLをつっこむ箇所)はそうはいきません。だってURLに&使うじゃん。


URLのパラメータをスラッシュ区切りで渡す方法に対応していれば回避できるなーと思ったけど、これも無理。


どうしよう。
まず原因を確認します。

▽エンティティ参照 (Entity reference
 http://gogodiet.net/z/xml/3_10.htm


文字参照とエンティティ参照 [XML 標準]
 http://msdn.microsoft.com/ja-jp/library/ms256190(VS.80).aspx


つまりはXMLでは、&はそのままじゃ使えない、と。
&は&とかかないと駄目ってことですね。


書き換えて、アップ動作確認、と。
しかし通らない……アクセス先でorz


アクセス先は
http://example.com/test.php?a=1&b=1
と書かないと駄目で、
http://example.com/test.php?a=1&b=1
ではとおらない
(リダイレクトされる仕様だけどリダイレクトされない)


出力されたRSSのソースをみると、
IEからはhttp://example.com/test.php?a=1&b=1
Firefoxからはhttp://example.com/test.php?a=1&b=1
とみえる。


Firefoxの場合に困っちゃいますね、このままだと……。



1.HTMLToFeed.class.phpをいじって、出力するときに&で吐くようにする。←しかしRSSXMLだから本来書いちゃいけないもの書いていることにならない?


2.先方に&を受け入れるようにお願いする
→なんとなく筋違いな気が(^^; そもそも応えてもらえない気がするし。


3.思いきってlinkを切る
→descriptionでリンクは張ってあるから問題ないともいえる
→そのうち短縮URLみたいな感じでこっち側で一度リダイレクトするURLを渡せるように書けばいい?

前向きなのは1。
対応してもらうのが難しそうだけど楽(?)なのは2。
現実的で問題が少ないのは3。


…………3かな。


チルダを書いていいのか悪いのか
 http://www.asahi-net.or.jp/~JY3K-SM/i_net/url.html


という指摘もあるけれど、


▽`&xx;` は不明な実体参照です。
 http://openlab.ring.gr.jp/k16/htmllint/explain.html#bad-entity


という記載を見た上で根拠となる書類を探すと、特にxhtmlでは


▽C.12 属性値の中でアンパサンドを使う
  (XHTML 1.0: 拡張可能ハイパーテキストマークアップ言語)
 http://www.doraneko.org/webauth/xhtml10/20000126/Overview.html#guidelines


「&」構文エラー?XHTMLでよく使う文字参照とは?
 (専門家に聞く コラム [All About プロファイル])
 http://profile.allabout.co.jp/ask/column_detail.php/26198


とあります。そりゃそうですね。xhtmlxml文書だ(^^;
てことで、一応筋違いではないらしいです。
xhtml上の記載の話とサーバ側が受け入れるhttpリクエストがどういうのを前提にするかは別の話ですね。


htmlで同じことを書いたら、Firefoxでもちゃんと通りました。
ってことは、UA側でデコードして送信してるってこと?ですね、htmlの場合。


しかしデコードするときとしないときの要件がわかんないんだよなぁ。
rssをとりあえずhtmlとbodyでくくって、linkでくくったURLをaタグに置き換えて、拡張子もhtmlにしてみたけど、この場合はデコードしないし。


正直よくわからんです。
エンコードされたURLのままでちゃんと受け取れるようにしておくべきっぽいんだけど、どうもそのあたりの根拠がよくわからないんだよなぁ


んー。けど普通URLエンコードで日本語部分とかでパラメータのこういう箇所の部分じゃ……なんか頭ぐるぐるしてきました。とりあえずペンディングにしてみようと思います。


ただ対応が難しいだろうことは明らかなので、3を前提にしつつも、一応要望をだしてみますかねぇ。




なお念のため。あんまり考えたことなかった、ここらへん。


PHP: htmlspecialchars -Manual
 http://www.php.net/manual/ja/function.htmlspecialchars.php