SimpleIsm

DTDをXHTML 1.1に変更

HTML

ruby要素を使いたくなったので。とは言ってみたものの、使う場面はAboutページぐらいしかなかったという。まぁもう一つ、否応なしにMIME typeをapplication/xhtml+xmlにしないといけないから、そういった意味で逃げ道を塞ぐという意味で。PHP化したためか、mod_rewriteを利用するとパースエラーになってしまったり、アクセス解析のページがおかしくなったりしてしまい、今までtext/htmlで妥協していたのです。

もう一つ事の発展は、XHTML1.1 に正しい MIME Type を - Code-404を見たからなんだけど、さらにasamuzaK.jp : PHP化を参考に、と言うかまんまコピペして、charsetとxml宣言を出力。

<?php
   if(isset($_SERVER["HTTP_ACCEPT"])) {
      $HA = explode(",", $_SERVER["HTTP_ACCEPT"]);
      if(in_array("application/xhtml+xml", $HA)) {
         header("content-type: application/xhtml+xml; charset=UTF-8");
      }
      else {
         header("content-type: text/html; charset=UTF-8");
      }
   }
   else {
      header("content-type: text/html; charset=UTF-8");
   }
   echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>

よく分からないけど、多分in_array("application/xhtml+xml", $HA)の条件に合うUAではapplication/xhtml+xmlを返して、それ以外ではtext/htmlを返すと解釈したのだけど、Fxで確認してみると、まだMIME typeがtext/htmlだったので、以下のように変更。

<?php
   if(isset($_SERVER["HTTP_ACCEPT"])) {
      $HA = explode(",", $_SERVER["HTTP_ACCEPT"]);
      if(in_array("application/xhtml+xml", $HA)) {
         header("content-type: application/xhtml+xml; charset=UTF-8");
      }
      else {
         header("content-type: application/xhtml+xml; charset=UTF-8");
      }
   }
   else {
      header("content-type: text/html; charset=UTF-8");
   }
   echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>

FxやOpera、Safariでは見事application/xhtml+xmlを返したのだけど、今度はIEで表示されなくなってしまい、意味ねーとか思っていたら、application/xhtml+xml に対応していない場合は text/html を吐くようにした ( Fuji Diablog )を発見。XHTML1.1 に正しい MIME Type を - Code-404 で掲載されている PHP のコードはちょっと正しくありませんとあるけど、当方何が正しくて何が正しくないのかさっぱり分かりません。でもif文なら少し分かります。なので条件式だけを少しだけ変更して、以下のように変更。

<?php
   if(preg_match('/[,^]\s*application\/xhtml\+xml\s*([,;$])/', $_SERVER["HTTP_ACCEPT"]) > 0) {
      $HA = explode(",", $_SERVER["HTTP_ACCEPT"]);
      if(in_array("application/xhtml+xml", $HA)) {
         header("content-type: application/xhtml+xml; charset=UTF-8");
      }
      else {
         header("content-type: application/xhtml+xml; charset=UTF-8");
      }
   }
   else {
      header("content-type: text/html; charset=UTF-8");
   }
   echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
?>

上記で試したらOKだった。それをxhtml11.txtで保存して、<?php include "</hoge/xhtml11.txt"; ?>って感じでファイルを挿入。IE6, 7で確認したけど、ちゃんと表示されるようになった。すげー!と思った。何がすげーって、こう記述すると何でちゃんと動作するのかさっぱり分からないのがすげー!

ただ、弊害なのか、記事の確認画面でパースエラーになってしまう。これはXML宣言も一緒に出力しているのが原因かもしれない。ので、あとで直して試してみようと思う。もう一つ、CGIだから勝手が違うのか、検索結果だけはそのまま<?php include "</hoge/xhtml11.txt"; ?>が吐き出されてしまい、仕方なくXHTML 1.0 Strictのままにしている。これはいつかちゃんと直そう。

当面の目標は、少しPHPとJavaScriptの勉強をして、今回のコードと、citation.jsの内容と意味をちゃんと理解することかな。

追記(2009/03/18 03:37)

XMLなんだから、整形式じゃなければパースエラーになるのは当然だよね。確認画面どころか、普通に記事自体がパースエラーになってた。バカが!pre要素内に「<」とか「>」をそのまま書いてたのが原因。直したら確認画面もちゃんと見れました。今ならJintrickさんがえ?XMLを手書きする気かよっ!と言っていた理由がよく分かる。

2009/03/18(Wed) 03:27
<<前の記事
ruby要素関係の正式名称
次の記事>>
雑記その75

Category

Archives