入力されたページが存在するかチェックするのに
以下のようなプログラムを組みました。
$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にしているので横棒「ー」部分がうまく変換されずに
>認識されていないのではないかと思う
思うじゃなくて、そうかどうかは
変換後の文字列を出力すればわかるので
まずはその確認からですね。
思うとか言う推定で対策なんてできません。