入力されたページが存在するかチェックするのに
以下のようなプログラムを組みました。
$keyword = "XXXX";
$url = "http://ja.wikipedia.org/wiki/".urlencode($keyword");
if(@!fopen($url,'r')){
echo "ページなし";
}else{
echo "ページあり";
}
XXXXに入れるキーワードは大概正常に動作するのですが
「イチロー」と入れると「ページなし」と判断されます。
出力されるURLは以下と同様なので、ページは存在すると
判断されるかと思うのですがうまくいきません。
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%81%E3%83%AD%E3%83%BC
文字コードをUTF-8にしているので横棒「ー」部分がうまく変換されずに
認識されていないのではないかと思うのですが具体的にはどの様にすれば
よいのでしょうか。
ご教授のほど宜しくお願い致します。
文字コードの変換が間違っているわけではありません。
Wikipediaでは呼び出し時にUser-Agentを必要とする場合があるようです。このため、URLが正しくても、PHPのfopen関数ではFALSEが返されることになります。
そこで、fsockopen関数を使ってダミーのUser-Agentを送ってやると、正しい反応が返ってきます。
以下にスクリプトを示します。
<?php function url_exists($url) { $arr = parse_url($url); $fp = fsockopen($arr['host'], 80); if ($fp == FALSE) return FALSE; $out = ''; $out .= "GET {$arr['path']} HTTP/1.1\r\n"; $out .= "Host: {$arr['host']}\r\n"; $out .= "User-Agent: Mozilla/5.0\r\n"; //これが必要 $out .= "\r\n"; fwrite($fp, $out); //HTTPコール $res = fgets($fp); //HTTPレスポンス $n = preg_match("/^(HTTP\/[0-9\.]+) ([0-9]+) (.+)/i", $res, $arr); if ($n == 0) return FALSE; $num = $arr[2]; if ($num >= 200 && $num < 400) return TRUE; //HTTP 200-399 ならOK return FALSE; } $keyword = "イチロー"; $url = "http://ja.wikipedia.org/wiki/" . urlencode($keyword); if (! url_exists($url)) { echo "ページなし"; }else{ echo "ページあり"; } ?>
http://www.tagindex.com/tool/url.html
こちらで変換した結果で確認してください。
ーに見える文字はいろいろあるので、URLエンコードが失敗してるというよりかは
入力文字が違う可能性の方が高いですよ。
>文字コードをUTF-8にしているので横棒「ー」部分がうまく変換されずに
>認識されていないのではないかと思う
思うじゃなくて、そうかどうかは
変換後の文字列を出力すればわかるので
まずはその確認からですね。
思うとか言う推定で対策なんてできません。
ご回答ありがとうございます。
>変換後の文字列を出力すればわかるので
>まずはその確認からですね。
分かりにくかったのかも知れませんが、私の質問に内容にもある通り
変換された文字は全く一緒です。一緒なのに認識されないのは「ー」が
あるからではないかなあ~ということです。
>出力されるURLは以下と同様なので、ページは存在すると
>判断されるかと思うのですがうまくいきません。
質問文を読めばわかるので
まずはその確認からですね。
的はずれなご説教にポイントなんてあげられません。
私が知りたいのはなぜ「イチロー」だと認識されないかということなので、
そういったご指摘はコメント欄にして頂けるとありがたいです。
文字コードの変換が間違っているわけではありません。
Wikipediaでは呼び出し時にUser-Agentを必要とする場合があるようです。このため、URLが正しくても、PHPのfopen関数ではFALSEが返されることになります。
そこで、fsockopen関数を使ってダミーのUser-Agentを送ってやると、正しい反応が返ってきます。
以下にスクリプトを示します。
<?php function url_exists($url) { $arr = parse_url($url); $fp = fsockopen($arr['host'], 80); if ($fp == FALSE) return FALSE; $out = ''; $out .= "GET {$arr['path']} HTTP/1.1\r\n"; $out .= "Host: {$arr['host']}\r\n"; $out .= "User-Agent: Mozilla/5.0\r\n"; //これが必要 $out .= "\r\n"; fwrite($fp, $out); //HTTPコール $res = fgets($fp); //HTTPレスポンス $n = preg_match("/^(HTTP\/[0-9\.]+) ([0-9]+) (.+)/i", $res, $arr); if ($n == 0) return FALSE; $num = $arr[2]; if ($num >= 200 && $num < 400) return TRUE; //HTTP 200-399 ならOK return FALSE; } $keyword = "イチロー"; $url = "http://ja.wikipedia.org/wiki/" . urlencode($keyword); if (! url_exists($url)) { echo "ページなし"; }else{ echo "ページあり"; } ?>
ご回答ありがとうございます。
バッチリ動作確認できました!!ありがとうございました。
wikipediaの仕様についても大変勉強になりました。
また機会がありましたら宜しくお願い致します。
ご回答ありがとうございます。
バッチリ動作確認できました!!ありがとうございました。
wikipediaの仕様についても大変勉強になりました。
また機会がありましたら宜しくお願い致します。