php4において、引数で与えられた相対URLを絶対URLに変換する関数、または公開されているソースはありませんか?

 .netのUriクラスのように、引数として与えれた絶対URLと相対URLから相対URLの絶対URLを取得する方法を探しています。
(ベースとなるHtmlからのリンク先を絶対URLで取得したい)

回答の条件
  • 1人2回まで
  • 登録:2006/05/18 11:04:31
  • 終了:2006/05/18 14:16:05

回答(2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数752006/05/18 11:17:51

relapathで絶対URLを求めることができます。

(勘違いしておりましたら、申し訳ありません。)

id:lains_you

 relapathでは、実行環境のサーバでの絶対パスが取得されると思います。

 そうではなくて、他のサーバに存在するコンテンツの絶対URLを取得したいのです。例えば、http://dailynews.yahoo.co.jp/fc/上でhref="/fc/domestic/index.html"となっている相対URLを絶対URL"http://dailynews.yahoo.co.jp/fc/domestic/index.html"で取得したいのです。

2006/05/18 11:31:28
id:ito-yu No.2

ito-yu回答回数323ベストアンサー獲得回数142006/05/18 12:25:33

ポイント115pt

<?php

$base = 'http://dailynews.yahoo.co.jp/fc/';

$href = '/fc/domestic/index.html';

echo getAbsPath($base, $href);

function getAbsPath($base, $href){

$url_info = parse_url($base);

$bdir = (substr($url_info['path'], -1) == '/') ? $url_info['path'] : dirname($url_info['path']).'/';

if(ereg('^https?://', $href)){

$path = $href;

}elseif(substr($href, 0, 1) == '/'){

$path = $url_info['scheme'].'://'.$url_info['host'].$href;

}else{

$path = $url_info['scheme'].'://'.$url_info['host'].$bdir.$href;

}

return $path;

}

?>


パスの途中に .. とかあるとしくじるかもしれませんが、それは正規表現で取り除けるんじゃないでしょうか。

私もこんなコードを利用してリバースプロクシ的な他力本願サイトを構築しようかと考え(後略

id:lains_you

 ありがとうございます。

 私は単にサーバ側にコンテンツを収集させようと思っただけなのですが、なかなか面倒です。素直にwgetを使った方が良いような気がしてきましたorz

2006/05/18 13:15:29
  • id:lains_you
    やっつけ仕事ですが、.と..の処理も追加してみました。

    function getAbsPath($base, $href){
    $url_info = parse_url($base);
    $bdir = (substr($url_info['path'], -1) == '/') ? $url_info['path'] : dirname($url_info['path']).'/';

    if(ereg('^https?://', $href)){
    $path = $href;
    }elseif(substr($href, 0, 1) == '/'){
    $path = $url_info['scheme'].'://'.$url_info['host'].$href;
    }else{
    $path = $url_info['scheme'].'://'.$url_info['host'].$bdir.$href;
    }

    $path = ereg_replace("/\./", "/", $path);
    while( ereg("\.\./", $path) ){
    $url_info = parse_url($path);
    $paths = preg_split("/\//", $url_info['path']);

    for( $cnt=1 ; $cnt<count($paths) ; $cnt++ ){
    if( $paths[$cnt] == ".." ){
    $paths[$cnt-1] = "";
    $paths[$cnt] = "";
    }
    }

    $str = "";
    foreach( $paths as $value ){
    if( strlen($value) != 0 ){
    $str .= "/".$value;
    }
    }

    $path = $url_info['scheme'].'://'.$url_info['host'].$str;
    }

    return $path;
    }
  • id:bonlife
    FTPのgetなどでは、.や..があってもその部分を解釈して適切に処理されるはずです。
    コンテンツ収集が目的であれば、キレイなパスになっている必要はないような気がしました。

    http://www.example.com/dir/sample.dat
    http://www.example.com/dir/../dir/sample.dat

    FTPのgetではどちらを引数に指定しても同じファイルを取得します。
    と書いてみましたが、wget使えば良いですよね、やっぱり。
  • id:lains_you
     bonlifeさん、情報ありがとうございます。何分初心者なもので、php側で解釈してくれるとは知りませんでした。

     wgetを使用しなかった理由は、サイトの再帰的取得かつ相対URLへの書き換えとともに、HTTPヘッダーで取得した対象コンテンツの情報と取得済みコンテンツの情報を比較して、更新があるものだけを取得したかったんです。

     Javaアプリは自力で作成したのですが、phpはよくわかりませんorz

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

トラックバック

  • PukiWikiの相対URL対応プラグイン 作業日報 2008-07-25 12:26:33
    ある複雑な社内のネット(事情も複雑・・)を介してアクセスがあるWikiWebサーバで「見れない!」(正確にはリンク先が)と苦情がった。調べてみるとクライアントの位置によってNATによりWikiWeb
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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