phpファイルをサーバーにアップすると、そのサーバー内のファイルのリンクが一覧で表示できるツールを作成しています。


表示サンプル:http://dowdow.jp/sitemap.php

URLの表示を、ページタイトルの表記に変えたいのですが、良い方法はないでしょうか。

現在のファイル:http://dowdow.jp/php.zip

回答の条件
  • 1人5回まで
  • 登録:2007/07/07 17:44:09
  • 終了:2007/07/14 17:45:03

回答(2件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/07/07 18:12:46

ポイント35pt

タイトルがあればタイトルを、無ければファイル名を表示というように変えればよろしいかと思います。

if ($fp) {
    fputs ($fp, "GET $suburl HTTP/1.0\r\n\r\n");
    while (!feof($fp)) {$buf=fgets ($fp,128);$all=$all.$buf;}
        fclose ($fp);
}
if(preg_match("/<title>(.*)<\/title>/i",$all,$match) == 1){
    $title = $match[1];
} else {
    $title = $suburl;
}
$link="<a href=\"$fullurl\" target=\"right\">$title</a><br>\n";

余談ですが、どうして自サバ内のファイル検索にソケット通信使っているのですか?

単純に

function getpage($path)
    $all=file($path);
    if(preg_match("/<title>(.*)<\/title>/i",$all,$match) == 1){
        $title = $match[1];
    } else {
        $title = $suburl;
    }
    $link="<a href=\"$fullurl\" target=\"right\">$title</a><br>\n";
}

でよろしいのではないかと思いますよ。

id:gondo

ありがとうございます。早速入れ替えてみました。しかし、やり方が悪いのか、サーバーが対応していないのか、

http://dowdow.jp/map.php

というような表示になってしまいます。

$fp = fsockopen ($hostname, 80, $errno, $errstr, 30); //ソケットを開く

if ($fp) {

fputs ($fp, "GET $suburl HTTP/1.0\r\n\r\n");

while (!feof($fp)) {$buf=fgets ($fp,128);$all=$all.$buf;}

fclose ($fp);

}

if(preg_match("/<title>2007/07/07 19:36:43

id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012007/07/07 20:05:49

ポイント35pt

見逃してました。ホスト名が入ってませんのでサーバーが見つからないってエラーをphpが返しています。

fputs ($fp, "GET $suburl HTTP/1.0\r\n\r\n");
  ↓
fputs ($fp, "GET $suburl HTTP/1.0\r\nHost:$hostname\r\n\r\n");

サーバーの設定にもよりますがfile内にhttp://で始まるURLを書いても取得できる場合がありますのでgetpageを下記のものと入れ替えてもテストしてみてください。

function getpage($suburl)
    global $hostname;
    $fullurl="http://$hostname".$suburl;
    $all=file($fullurl);
    if(preg_match("/<title>(.*)<\/title>/i",$all,$match) == 1){
        $title = $match[1];
    } else {
        $title = $suburl;
    }
    $link="<a href=\"$fullurl\" target=\"right\">$title</a><br>\n";
}
id:gondo

なるほど!!

できました。

http://dowdow.jp/map.php

スタイルシートでデザインすれば、いろんなところで使えそうです。

本当にありがとうございます!!



その他いろいろ試してみます。

2007/07/07 22:45:20
  • id:kn1967
    要点はご理解いただけたようで嬉しく思いますとともに、テストせずに書き込んでいたので、いろいろ細かな誤記があり申し訳なく思っております。

    お詫びというわけでもありませんが、自前のローカルサーバでのテスト(LAPP環境のphpで5万回のループ処理という限界に挑戦かというようなバカな作業:5時間ぶん回し状態)が終わってサーバが空いたので造ってみました。
    php4.2.3という少々古い型で動作確認しましたので、たいていのプロバイダなどでは動くと思います。
    <?php
    //
    //サイトマップ作成PHP
    //
    //----------定数宣言
    define("StartPath","./"); //探し始めるディレクトリ(末尾は/で終わっている事)
    define("MaxCall",2); //再帰呼び出しはメモリ(スタック)を食うので階層深度を適当に決めておきます。
    define("ExtensionPattern","/\.(htm|html|php)$/"); //対象とするファイル拡張子
    define("SearchPattern","/<title>(.*)<\/title>/i"); //検索対象
    //
    //----------サブルーチン
    function dir_tree($path){
    static $count = 0; //この行は再帰呼び出し時には無視されますので階層が判ります。
    echo "<ul>$path\r\n";
    $count++; //ディレクトリ内に入る度に増分して現在深度を示す。
    if($count > MaxCall) {
    echo "<li>設定された階層深度限界のため、これ以下は表示されません</li>";
    }else{
    if(!is_dir($path)){ // $pathがディレクトリで無ければ何もしない。
    }elseif($handle = opendir($path)){
    //
    // ディレクトリ内検索
    $index = false;
    $dir_array = array();
    $file_array = array();
    while(false !== $file = readdir($handle)){
    if($file == "." || $file == "..") {
    }elseif(is_dir($path . $file)) {
    array_push($dir_array, $file);
    }elseif($file == "index.html") {
    $index = true;
    }elseif(preg_match(ExtensionPattern,$file) == 1) {
    array_push($file_array, $file);
    }
    }
    closedir($handle);
    //
    // ファイル名列挙
    sort($file_array); //ファイル名順にソート
    if($index == true){
    unshift($file_array, "index.html"); //配列の先頭にindex.htmlを附加
    }
    foreach($file_array as $file){
    if(preg_match(SearchPattern,join("",file($path . $file)),$match) == 1){
    echo "<li><a href=\"$path$file\">$match[1]</a>\r\n";
    }else{
    echo "<li><a href=\"$path$file\">$file</a>\r\n";
    }
    }
    //
    // サブディレクトリ検索
    sort($dir_array); //ディレクトリ名順にソート
    foreach($dir_array as $dir){
    dir_tree($path . $dir . "/");
    }
    }
    }
    $count--; //呼び出し元に戻るので深度を戻す。
    echo "</ul>\r\n";
    }
    //
    //----------メインルーチン
    echo"<font size=\"2\">\r\n";
    dir_tree(StartPath); //サイトマップを作成したい階層
    echo"</font>\r\n";
    ?>
  • id:gondo
    すみません。お礼が遅くなりました。


    作成頂き恐縮です。


    早速試してみます。

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

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

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

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