人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで特定ページの存在チックについてのご質問です。

入力されたページが存在するかチェックするのに
以下のようなプログラムを組みました。

$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にしているので横棒「ー」部分がうまく変換されずに
認識されていないのではないかと思うのですが具体的にはどの様にすれば
よいのでしょうか。

ご教授のほど宜しくお願い致します。

●質問者: gelgelgel
●カテゴリ:インターネット ウェブ制作
✍キーワード:echo keyword PHP URL UTF-8
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● hanako393
●0ポイント

http://www.tagindex.com/tool/url.html

こちらで変換した結果で確認してください。

ーに見える文字はいろいろあるので、URLエンコードが失敗してるというよりかは

入力文字が違う可能性の方が高いですよ。

>文字コードをUTF-8にしているので横棒「ー」部分がうまく変換されずに

>認識されていないのではないかと思う

思うじゃなくて、そうかどうかは

変換後の文字列を出力すればわかるので

まずはその確認からですね。

思うとか言う推定で対策なんてできません。

◎質問者からの返答

ご回答ありがとうございます。

>変換後の文字列を出力すればわかるので

>まずはその確認からですね。

分かりにくかったのかも知れませんが、私の質問に内容にもある通り

変換された文字は全く一緒です。一緒なのに認識されないのは「ー」が

あるからではないかなあ?ということです。

>出力されるURLは以下と同様なので、ページは存在すると

>判断されるかと思うのですがうまくいきません。

質問文を読めばわかるので

まずはその確認からですね。

的はずれなご説教にポイントなんてあげられません。

私が知りたいのはなぜ「イチロー」だと認識されないかということなので、

そういったご指摘はコメント欄にして頂けるとありがたいです。


2 ● yamaneroom
●100ポイント ベストアンサー

文字コードの変換が間違っているわけではありません。

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の仕様についても大変勉強になりました。

また機会がありましたら宜しくお願い致します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ