&コワイ
今日も今日とて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をいじって、出力するときに&で吐くようにする。←しかしRSSもXMLだから本来書いちゃいけないもの書いていることにならない?
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
とあります。そりゃそうですね。xhtmlもxml文書だ(^^;
てことで、一応筋違いではないらしいです。
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