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

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

回答の条件
  • URL必須
  • 1人1回まで
  • 13歳以上
  • 登録:2010/06/24 01:52:30
  • 終了:2010/06/25 00:18:52

ベストアンサー

id:yamaneroom No.2

yamaneroom回答回数1040ベストアンサー獲得回数612010/06/24 17:26:40

ポイント100pt

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

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 "ページあり";
}

?>
id:gelgelgel

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

バッチリ動作確認できました!!ありがとうございました。

wikipediaの仕様についても大変勉強になりました。

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

2010/06/25 00:18:38

その他の回答(1件)

id:hanako393 No.1

hanako393回答回数1142ベストアンサー獲得回数872010/06/24 10:49:20

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

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

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

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

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

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

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

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

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

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

id:gelgelgel

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

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

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

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

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

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

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

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

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

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

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

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

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

2010/06/24 13:40:58
id:yamaneroom No.2

yamaneroom回答回数1040ベストアンサー獲得回数612010/06/24 17:26:40ここでベストアンサー

ポイント100pt

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

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 "ページあり";
}

?>
id:gelgelgel

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

バッチリ動作確認できました!!ありがとうございました。

wikipediaの仕様についても大変勉強になりました。

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

2010/06/25 00:18:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません