facebook twitter hatena line email

「Php/自作ユーティリティclass kz」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
行1,325: 行1,325:
 
     /* item を探します */
 
     /* item を探します */
 
     $result = $xml->xpath('item');
 
     $result = $xml->xpath('item');
     // [query] => xxx,[rank] => 4,[prev_rank] => 7,[score] => 106.03,[snippet] => xxx,
+
     // [query] => ***,[rank] => 4,[prev_rank] => 7,[score] => 106.03,[snippet] => ***,
 
      
 
      
 
     $arr = array();
 
     $arr = array();

2020年9月14日 (月) 16:18時点における最新版

<?php
/**
 * phpユーティリティ集+α
 * いろんな機能をごちゃ混ぜで結合してます。一番やっちゃいけない暗号的結合なクラスです
 * 使いようのものから意味不明なものまで、
 * もしかするとほりだしものもあるかも。
 * クラスとして使えなくはないですが、使いたいやつをコピーしてもってくのが良いかと思います。
 * このスクリプトはsjisで保存
 * 
 * gethtml()はpearのHTTP/Client必須
 */
// php技術メモ、このクラスとはまったく無関係
// set_time_limit(0);処理時間を無限に
// http_build_query    // 配列からURLのパラメータを作成 (逆:parse_url)
// parse_ini_file() //iniファイル取得
// ini_set("display_errors", true);  // レポート表示
// ini_set("error_reporting", E_ALL);  // レポート種類
// ini_set("error_reporting", E_ERROR & ~E_NOTICE & ~E_PARSE);  // 関数非推奨エラーを除いたエラー
// ini_set("log_errors", true);  // レポートログ
// ini_set("error_log", "./php_error.log");  // レポートログ
// ini_set("memory_limit", "64M");  // メモリサイズ変更
class class_kz
{
  // コンストラクタ
  function class_kz()
  {
  }
  //--------------------------------------------------
  /**
   * ウェブ上のhtmlソースを取得
   *
   * @param  string  $url  URL
   * @param  string  $mobile  (softbank,au,docomo
   * @return  string  $rtn  コンテンツ
   */
  function gethtml($url, $mobile = false)
  {
    // pear
    require_once "HTTP/Client.php";
    $client =& new HTTP_Client();
    if ($mobile) {
      if ($mobile == "softbank") {
        $agent = 'SoftBank/1.0/DM002SH/SHJ001[/Serial] Flash/Flash-Lite/2.0';
      } elseif ($mobile == "au") {
        $agent = 'UP.Browser/6.2.0.5 (GUI) MMP/2.0';
      } else {
        $agent = 'DoCoMo/2.0 N901iS(c100;TB;W24H12)';
      }
    } else {
      $agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)';
    }
    $client->setDefaultHeader('User-Agent', $agent);
    $client->get($url);
    $response = $client->currentResponse();
    if ($response["code"] == 200) {
      return $response['body'];
    } else {
      die("kz_class false gethtml() " . $response["code"] . " request " . $url);
    }
  }
//  /**
//   * ウェブ上のhtmlソースを取得
//   * 
//   * クローラ対策時の偽装方法
//   * ini_set("user_agent", "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
//   * ini_set("user_agent", "DoCoMo/2.0 N901iS(c100;TB;W24H12)");
//   * @param  string  $url  URL
//   * @return  string  $rtn  コンテンツ
//   */
//  function gethtml($url, $mode = false)
//  {
//    $rtn = file_get_contents($url);
//    return $rtn;
//  }
  //--------------------------------------------------
  /**
   * htmlからtextへ
   * phpに同義関数あり
   *
   * @param  string  $value            html
   * @return  string  htmlspecialchars($value)  text
   */
  function html_to_text($value)
  {
    return htmlspecialchars($value);
  }
  //--------------------------------------------------
  /**
   * textからhtmlへ
   * phpに同義関数あり
   *
   * @param  string  $value              text
   * @return  string  htmlspecialchars_decode($value)  html
   */
  function text_to_html($value)
  {
    return htmlspecialchars_decode($value);
  }
  //--------------------------------------------------
  /**
   * テーブル式のデータ取得
   *
   * @param  string  $filename  ファイル名
   * @return  object  $rtn    読み込みデータ
   */
  function get_file_table($filename)
  {
    $head = array();
    $data = array();
    $rtn = array();
    if (!$handle = fopen($filename, 'r')) {
      // exit();
    }
    if ($handle) {
      $i = 0;
      while (!feof($handle)) {
        $line = fgets($handle, 1024);
        if ($line != "") {              // 空文字を省く
          $data = split("\t", $line);
          if ($i == 0) {
            foreach ($data as $value) {
              $value = preg_replace("/\r\n/", "", $value);    // 改行を省く
              array_push($head, $value);
            }
          } else {
            foreach ($head as $key => $value) {
              $data[$key] = preg_replace("/\r\n/", "", $data[$key]);  // 改行を省く  
              $row[$value] = $data[$key];
            }
            array_push($rtn, $row);
          }
          $i++;
        }
      }
      fclose($handle);
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * テーブル式のデータ格納
   *
   * @param    string  $filename  ファイル名
   * @param    object  $data    データ
   * @return    void
   */
  function set_file_table($filename, $data)
  {
    $out = "";
    if ($data) {
      $array = array_keys($data[0]);
      foreach ($array as $value) {
        $out .= $value."\t";
      }
    }
    $out .= "\r\n";
    foreach ($data as $key1=> $value1) {
      foreach ($value1 as $key2 => $value2) {
        $out .= $value2."\t";
      }
      $out .= "\r\n";
    }
    // file_put_contents($filename, $out);  // php4ノーサポート
    
    // 書き込みモードでファイルを開く
    if (!$handle = fopen($filename, 'w')) {
      exit;
    }
    if (fwrite($handle, $out) === FALSE) {
      exit;
    }
    fclose($handle);
  }
  //--------------------------------------------------
  /**
   * テーブル式のデータからデータ削除
   *
   * @param    string  $filename  ファイル名
   * @param    array  $where    条件
   * @return    void
   */
  function del_file_table($filename, $where)
  {
    $data = $this->get_file_table($filename);
    $temp = array();
    foreach ($data as $key =>$value) {
      $del_flg = 1;
      foreach ($where as $keyw => $valuew) {
        if ($data[$key][$keyw] != $valuew) {
          $del_flg = 0;
        }
      }
      // 削除のとき
      if ($del_flg == 1) {
      // 削除しないとき
      } else {
        array_push($temp, $value);
      }
    }
    $this->set_file_table($filename, $temp);
  }
  //--------------------------------------------------
  /**
   * テーブル式のデータにデータ追加
   *
   * @param    string  $filename  ファイル名
   * @param    array  $where    条件
   * @return    void
   */
  function insert_file_table($filename, $data)
  {
  }
  //--------------------------------------------------
  /**
   * ファイルから単一データ取得
   *
   * @param    string  $filename  ファイル名
   * @return    string  $rtn    取得データ
   */
  function get_file_data($filename)
  {
    if (!$handle = fopen($filename, 'r')) {
      return;
    }
    $rtn = "";
    if ($handle) {
      while (!feof($handle)) {
        $line = fgets($handle, 1024);
        $rtn .= $line;
      }
      fclose($handle);
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * ファイルへ単一データ書込
   *
   * @param    string  $filename  ファイル名
   * @param    string  $data    書込データ
   * @return    void
   */
  function set_file_data($filename, $data)
  {
    //書き込みモードでファイルを開く
    if (!$handle = fopen($filename, 'w')) {
      return;
    }
    if (fwrite($handle, $data) === FALSE) {
      return;
    }
    fclose($handle);
  }
  //--------------------------------------------------
  /**
   * ファイルから配列データ取得
   *
   * @param    string  $filename  ファイル名
   * @return    array  $arr    配列データ
   */
  function get_file_array($filename)
  {
    if (file_exists($filename)) {
      return file($filename);
    }
  }
  //--------------------------------------------------
  /**
   * ファイルへ配列データを設定
   *
   * @param    string  $filename  ファイル名
   * @param    array  $arr    配列データ
   * @return    void
   */
  function set_file_array($filename, $arr)
  {
    foreach ($arr as $value) {
      $buf .= $value;
    }
    $this->set_file_data($filename, $buf);
  }
  //--------------------------------------------------
  /**
   * ファイルからtsvデータ取得
   *
   * @param    string  $path  ファイル名
   * @return    array  $arr  配列データ
   */
  function get_file_tsv($path)
  {
    $lines = $this->get_file_array($path);
    foreach ($lines as $line) {
      $line = preg_replace("/\r\n|\r|\n/", "", $line);
      $rows = split("\t", $line);
      $arr[] = $rows;
    }
    return $arr;
  }
  //--------------------------------------------------
  /**
   * ファイルへtsvデータを設定
   *
   * @param    string  $path  ファイル名
   * @param    array  $arr  配列データ
   * @return    void
   */
  function set_file_tsv($path, $arr)
  {
    foreach($arr as $rows) {
      unset($line);
      foreach ($rows as $key => $value) {
        $line .= $value;
        if (count($rows) - 1 != $key) {
          $line .= "\t";
        }
      }
      $lines[] = $line . "\n";
    }
    $this->set_file_array($path, $lines);
  }
  //--------------------------------------------------
  /**
   * dir内のファイル名一覧を取得
   *
   * @param   string  $dirname  フィルダ名
   * @param  int    $kakutyousi  拡張子有り(1)無し(0)      option
   * @return  array  $rtn    フォルダ内のファイル名
   */
  function get_dir_file($dirname, $kakutyousi = 1)
  {
    if (!file_exists($dirname)) return;
    $rtn = array();
    $handle = openDir($dirname);
    while(false !== $name = readDir($handle)) {
      if ($name != "." && $name != "..") {
        if ($kakutyousi == 0) {
          $name = preg_replace("/.[^.]*$/", "", $name);  // 拡張子削除
        }
        array_push($rtn, $name);
      }
    }
    return $rtn;
  }
  // dir内のファイルを削除
  function del_dir_file($dirname)
  {
    if (!file_exists($dirname)) return;
    $files = $this->get_dir_file($dirname, 1);
    if ($files) {
      // ファイル削除
      foreach ($files as $file) {
        unlink($dirname . "/" . $file);
      }
    }
  }
  //---------------------------------------------------------------------
  /**
   * ファイルを追加書き込み
   *
   * @access  public
   * @param  String  $filename  ファイル名
   * @param  String  $value    書込データ
   * @return            なし
   */
  function add_file_data($filename, $value) {
    if ($fp = fopen($filename, "a")) {
      flock($fp, LOCK_EX);
      fputs($fp, $value);
      flock($fp, LOCK_UN);
      fclose($fp);
    }
  }
  //--------------------------------------------------
  /**
   * 画像リサイズ
   *
   * @param  string  $img_name = "image.jpg"; //ファイル名(JPEG画像)
   * @param  string  $img_path = "./"; //サムネイルを作る元画像のあるディレクトリ(必ず末尾は"/"で閉じる)
   * @param  string  $thumbnail_path = "thumbnail/"; //サムネイルを保存するディレクトリ
   * @param  string  $thumbnail_w = 80; //サムネイルの横幅
   * @param  string  $thumbnail_h = 60; //サムネイルの縦幅
   * @return  void
   * @GD要  extension=php_gd2.dll
   * @参考  http://noongoro.main.jp/note/note0052.html
   */
  function create_thumbnail($img_name, $img_path, $thumbnail_path, $thumbnail_w, $thumbnail_h)
  {
    //元画像のサイズ取得
    list($img_w, $img_h) = getimagesize($img_path.$img_name);
    //縦比に対しての変更後の横幅を取得
    $thumbnail_w_tmp = floor($thumbnail_h/$img_h*$img_w);
    //横幅が指定幅より狭いときは縦幅を縮小する
    if ($thumbnail_w_tmp < $thumbnail_w) {
      $thumbnail_w = $thumbnail_w_tmp;
    } else {
      $thumbnail_h = floor($thumbnail_w/$img_w*$img_h);
    }
    $src_img = @imagecreatefromjpeg ( $img_path.$img_name );
    if ($src_img) {
      $dst_img = imagecreatetruecolor ( $thumbnail_w, $thumbnail_h );
      $result = imagecopyresampled ( //$result = imagecopyresized (
          $dst_img, //貼り付けするイメージID
          $src_img, //コピーする元になるイメージID
          0,    //int dstX (貼り付けを開始するX座標)
          0,    //int dstY (貼り付けを開始するY座標)
          0,    //int srcX (コピーを開始するX座標)
          0,    //int srcY (コピーを開始するY座標)
          $thumbnail_w, //int dstW (貼り付けする幅)
          $thumbnail_h, //int dstH (貼り付けする高さ)
          $img_w,   //int srcW (コピーする幅)
          $img_h  //int srcH (コピーする高さ)
        );
      //サムネイルをJPEG形式で保存
      imagejpeg ( $dst_img, $thumbnail_path.$img_name );
      imagedestroy ( $dst_img ); //サムネイル用イメージIDの破棄
      imagedestroy ( $src_img ); //サムネイル元イメージIDの破棄
    } else {
      exit();  // error
    }
  }
  //--------------------------------------------------
  /**
   * 画像出力
   *
   * @param  string  $addr  画像アドレス
   * @return  data      画像データ
   * @GD要  extension=php_gd2.dll
   */
  function imageout($addr)
  {
    //出力画像形式をgifに指定
    header("Content-type:image/gif");
    //画像を読み込み
    $img = ImageCreateFromGif($addr);
    //画像PNG形式で出力
    ImageGif($img);
    //画像用メモリ開放
    ImageDestroy($img);
    //プログラム終了(誤動作防止)
    exit;
  }
  //--------------------------------------------------
  /**
   * ファイルアップロード表示
   *
   * @access  public
   * @param  string  $phpname  アップ処理のスクリプトのファイル名指定
   * @return  void
   * @link  http://jp.php.net/manual/ja/features.file-upload.php
   * @ex    print $obj_kz->$file_up_html("fileup.php");
   */
  function file_up_html($phpname)
  {
    $out =<<<EOD
<form enctype="multipart/form-data" action={$phpname} method="POST">
<!-- MAX_FILE_SIZE バイト数指定 -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000000" />
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
EOD;
    return $out;
  }
  //--------------------------------------------------
  /**
   * ファイルアップロード処理
   *
   * @access  public
   * @param  string    $uploaddir  アップロード先のフォルダ指定
   * @param  string    $type    ファイルタイプ規制        option    画像のみのときは:"image"
   * @return  string    $rtn    正常:"true"、エラー:"error"、ファイルタイプ不整合:"error_type"、
   *                  ファイルアップロードエラー:"false"、既にUP済み:"already_exists"
   * 例)if ($_FILES) {file_up_php("./up/");}
   */
  function file_up_php($uploaddir, $type="")
  {
    // uploaddir = './up/';
    if ($_FILES["userfile"]["error"] > 0) {
      $rtn = "error";
      // echo "Error: " . $_FILES["userfile"]["error"] . "<br/>";
    } else {
      if ($type != "") {
        $match = preg_match("/{$type}/", $_FILES["userfile"]["type"]);
        if (!$match) {
          $rtn = "error_type";
        }
      }
      if (!$rtn) {
        $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
        if (file_exists($uploadfile)) {
          $rtn = "already_exists";
        } else {
          if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
            $rtn = "true";
          } else {
            $rtn = "false";
          }
        }
      }
    }
    // print nl2br(print_r($_FILES, 1));  // デバッグ用
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 改行記号削除
   *
   * @access  public
   * @param  string  $text  元データ
   * @return  string  $rtn  改行記号削除データ
   */
  function text_to_del_n($text)
  {
    $rtn = preg_replace("/(\r|\n|\r\n)/", "", $text);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * tab記号削除
   *
   * @access  public
   * @param  string  $text  元データ
   * @return  string  $rtn  tab記号削除データ
   */
  function text_to_del_t($text)
  {
    $rtn = preg_replace("/(\t)/", "", $text);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * Bタグ削除
   *
   * @access  public
   * @param  string  $text  元データ
   * @return  string  $rtn  削除データ
   */
  function text_to_del_b($text)
  {
    $rtn = preg_replace("/<[\/]?b>/i", "", $text);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * タグ削除
   *
   * @access  public
   * @param  string          $text  元データ
   * @param  mixed      option  $tag  タグ(文字列か、配列か、|区切り文字列か)
   * @return  string          $text  削除データ
   * phpに同義関数有り  strip_tags
   */
  function text_to_del_tag($text, $tag="")
  {
    // 文字列の時
    if (is_string($tag)) {
      // 配列形式の文字列のとき
      if (preg_match("/\|/", $tag)) {
        $arr = array();
        $arr = split("\|", $tag);
        $text = $this->text_to_del_tag($text, $arr);    // 再起
      //--------------------------------------------------
      // 文字列の時
      } else {
        $text = preg_replace("/<[\/]?{$tag}[^>]*>/i", "", $text);  // タグ削除
      }
    //--------------------------------------------------
    // 配列データのとき
    } elseif (is_array($tag)) {
      foreach ($tag as $value) {
        $text = $this->text_to_del_tag($text, $value);    // 再起
      }
    }
    if (!$tag) {
      $text = strip_tags($text); // 全タグを取り除く
    }
    return $text;
  }
  //--------------------------------------------------
  /**
   * Aタグ取得
   *
   * @access  public
   * @param  string  $text          取得元データ
   * @param  string  $addr    option    取得URLパターン(正規表現)
   * @param  string  $front    option    タグ内の先頭要素
   * @param  string  $option    option    nohttp":httpがないURLでも取得]
   * @return  array  $matches        [0]:Aタグ、[1]:URL、[2]:title
   */
  function text_to_tag_a($text, $addr="", $front = "", $option = "")
  {
    if ($addr == "") {
      $addr = "http:\/\/[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    }
    if ($option == "nohttp") {
      $addr = "[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    }
    preg_match_all("/<a$front href=[\"\']?({$addr})[\"\']?[^>]*>([^<]*)<\/a>/i", $text, $matches);
    return $matches;
  }
  //--------------------------------------------------
  /**
   * imgタグ取得
   *
   * @access  public
   * @param  string  $text          元データ
   * @param  string  $addr    option    取得URLパターン(正規表現)
   * @param  string  $front    option    タグ内の先頭要素
   * @param  string  $option    option    nohttp":httpがないURLでも取得]
   * @return  array  $matches        :imgタグ、[1]:URL
   */
  function text_to_tag_img($text, $addr = "", $front = "", $option = "")
  {
    if ($addr == "") {
      $addr = "http:\/\/[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    }
    if ($option == "nohttp") {
      $addr = "[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    }
    preg_match_all("/<img$front src=[\"\']?({$addr})[\"\']?[^>]*>/i", $text, $matches);
    return $matches;
  }
  //--------------------------------------------------
  /**
   * like文から正規表現文を作成
   *
   * @access  public
   * @param  string  $addr
   * @return  string  $rtn
   */
  function like_to_reg($addr)
  {
    $exp = "[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    $addr = str_replace("/", "\/", $addr);
    $rtn = str_replace("%", $exp, $addr);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 'を
   *
   * @param  string  $str  元文字列
   * @return  string  $rtn
   * このメソッドは廃止。mysqlのquoteへ  
   * phpに同義関数有り addslashes
   */
  function quote_to_two_quote($str)
  {
    $rtn = str_replace("'", "", $str);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * date文字列からunixtime
   *
   * @access  public
   * @param  string  $str
   * @return  int    $value
   * @例  2007-08-22 01:20:08 →1187713208
   * strtotime( "2009-09-26 23:00:00" )でもできる
   */
  function date_to_unixtime($str)
  {
    $value = mktime(substr($str,11,2), substr($str,14,2), substr($str,17,2), substr($str,5,2), substr($str,8,2), substr($str,0,4));
    return $value;
  }
  //--------------------------------------------------
  /**
   * unixtimeからdate文字列
   *
   * @access  public
   * @param  int    $time
   * @return  string  date("Y-m-d H:i:d", time($str))
   * @例  1187713208 → 2007-08-22 01:20:08
   */
  function unixtime_to_date($time)
  {
    return date("Y-m-d H:i:d", $time);
  }
  //--------------------------------------------------
  /**
   * ページラベルを表示(廃止の方向で、下を使う)
   *
   * @access  public
   * @param  int    $rowcnt          データ数
   * @param  int    $nowpage        現在のページ数
   * @param  int    $viewnum        表示データ数
   * @param  int    $pageviewnum  option  ページ数上限
   * @return  array  $pagerow        ページラベル
   */
  function page_label($rowcnt, $nowpage, $viewnum, $pageviewnum = 10)
  {
    $pagecnt = floor(($rowcnt-1) / $viewnum) + 1;
    if (!$nowpage) {
      $page = 1;
    } else {
      $page = $nowpage;
    }
    $rowstart = ($page-1) * $viewnum;  // 表示する最初のデータ番号
    $rowlast = $rowstart + $viewnum;  // 表示する最後のデータ番号
    if ($rowlast > $rowcnt) {$rowlast = $rowcnt;}
    $pagerow = array();
    $pagef = $page - floor($pageviewnum / 2);    // 最初のページ番号
    if ($pagef <= 0) {$pagef = 1;}
    $pagea = $pagef + $pageviewnum - 1;        // 最後のページ番号
    if ($pagea > $pagecnt) {
      $pagea = $pagecnt;
    }
    if ($pagea - $pageviewnum < $pagef) {
      $pagef = $pagea - $pageviewnum + 1;      // 最初のページ番号
      $pagea = $pagef + $pageviewnum - 1;      // 最後のページ番号
    }
    if ($pagef <= 0) {$pagef = 1;}
    for ($i = $pagef; $i <= $pagea; $i++) {
      if ($i > $pagecnt) {
        continue;
      }
      array_push($pagerow, $i);
    }
    // 1ページのみのときはデータを返さない
    if (count($pagerow) == 1) {
      $pagerow = "";
    } else {
      // 次へ(next)をつける
      
      // 戻る(pref)をつける
    }
    return $pagerow;
  }
  //--------------------------------------------------
  /**
   * ページャーを表示
   *
   * @access  public
   * @param  int    $rowcnt          データ数
   * @param  int    $nowpage        現在のページ数
   * @param  int    $viewnum        表示データ数
   * @param  int    $pageviewnum  option  ページ数上限
   * @return  array  $rtn          ページラベル  例){page=>array(1,"...",20,21,"...",40),prev=>19,next=>21}
   */
  function pager($rowcnt, $nowpage, $viewnum, $pageviewnum = 10)
  {
    $pagecnt = floor(($rowcnt-1) / $viewnum) + 1;
    $nowpage = floor($nowpage);
    if ($nowpage <= 0) {
      $nowpage = 1;
    }
    if ($nowpage > $pagecnt) {
      $nowpage = $pagecnt;
    }
    $rowstart = ($nowpage-1) * $viewnum;  // 表示する最初のデータ番号
    $rowlast = $rowstart + $viewnum;  // 表示する最後のデータ番号
    if ($rowlast > $rowcnt) {$rowlast = $rowcnt;}
    $pagerow = array();
    $pagef = $nowpage - floor($pageviewnum / 2);    // 最初のページ番号
    if ($pagef <= 0) {$pagef = 1;}
    $pagea = $pagef + $pageviewnum - 1;        // 最後のページ番号
    if ($pagea > $pagecnt) {
      $pagea = $pagecnt;
    }
    if ($pagea - $pageviewnum < $pagef) {
      $pagef = $pagea - $pageviewnum + 1;      // 最初のページ番号
      $pagea = $pagef + $pageviewnum - 1;      // 最後のページ番号
    }
    if ($pagef <= 0) {$pagef = 1;}
    for ($i = $pagef; $i <= $pagea; $i++) {
      if ($i > $pagecnt) {
        continue;
      }
      array_push($pagerow, $i);
    }
    //--------------------------------------------------
    // トップと最後のは必ず表示するときの処理↓
    if ($pageviewnum >= 3) {  // 表ページ数が3つ以上でないと使えない
      if ($pagerow) {    // ページ数があるとき
        // ページ飛ばし機能
        if ($pagerow[0] >= 2) {
          array_shift($pagerow);        // 最初の配列を取除く
          array_unshift($pagerow, "...");    // 最初に配列追加
          array_unshift($pagerow, 1);      // 最初に配列追加
        }
        $lastrowpage = count($pagerow) - 1;
        if ($pagerow[$lastrowpage] <= $pagecnt - 1) {
          array_pop($pagerow);        // 最後の配列を取除く
          array_push($pagerow, "...");    // 最後の配列追加
          array_push($pagerow, $pagecnt);    // 最後の配列追加
        }
      }
    }
    //--------------------------------------------------
    
    // 1ページのみのときはデータを返さない
    if (count($pagerow) == 1) {
      $pagerow = "";
    } else {
      if ($pagecnt > $nowpage) {
        $rtn["next"] = $nowpage + 1;    // 次へ(next)をつける
      }
      if ($nowpage >= 2) {
        $rtn["prev"] = $nowpage - 1;    // 前へ(prev)をつける
      }
    }
    if ($pagerow) {
      $rtn['page'] = $pagerow;
    }
    $rowstart++;
    if ($rowstart < 0) {
      $rowstart = 0;
    }
    $rtn['now'] = $nowpage;          // 現在のページ
    $rtn['last'] = $pagecnt;        // 最後のページ
    $rtn['data_start'] = $rowstart;    // 表示する最初のデータ番号
    $rtn['data_last'] = $rowlast;      // 表示する最後のデータ番号
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * フルパスの内ディレクトリパスを返す
   *
   * @param  string  $path  パス
   * @return  void
   */
  function fullpath_to_dirpath($path)
  {
    // $pos = strrpos($path, "/") + 1;
    // $rtn = substr($path, 0, $pos);
    $rtn = dirname($path)."/";
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * ディレクトリパスとファイル名を結合する(/の数が重ならないように処理)
   *
   * @param  string  $dir  ディレクトリパス
   * @param  string  $file  ファイルパス
   * @return  string  $rtn  結合パス
   */
  function dirpath_marge_filename($dir, $file)
  {
    if (substr($dir, -1, 1) == "/") {
      if (substr($file, 0, 1) == "/") {
        $file = substr($file, 1);
      }
    }
    $rtn = $dir . $file;
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 配列の中に、あるデータが正規表現で一致する場合、配列の中のデータを取得(複数ある場合は最初のデータを取得)
   *
   * @param  string  $str  検索文字列
   * @param  array  $arr  対象配列
   */
  function array_reg($str, $arr)
  {
    foreach ($arr as $key => $value) {
      if (preg_match("/{$str}/", $value)) {
        return $value;
      }
    }
  }
  //--------------------------------------------------
  /**
   * 配列の中に、あるデータが含まれている場合、配列の中のデータを取得(複数ある場合は最初のデータを取得)
   *
   * @param  string  $str  検索文字列
   * @param  array  $arr  対象配列
   */
  function array_pos($str, $arr)
  {
    foreach ($arr as $key => $value) {
      $pos = strpos($value, $str);
      if ($pos !== false) {
        return $value;
      }
    }
  }
  //--------------------------------------------------
  /**
   * X文字以上の文字は切り捨て
   *
   * @param  string  $str      対象文字
   * @param  int    $len      表示文字数
   * @param  string  $plus  option  付加文字
   * @return  string  $str
   */
  function strtrim($str, $len, $plus = "")
  {
    if (strlen($str) > $len) {
      $str = substr($str, 0, $len).$plus;
    }
    return $str;
  }
  //--------------------------------------------------
  /**
   * 携帯判別
   *
   * @return  string  端末名
   */
  function get_mobile_name()
  {
    $agent = $_SERVER['HTTP_USER_AGENT'];
    // i-mode
    if (preg_match("/^DoCoMo/", $agent)) {
      return "docomo";
      // softbank
    } elseif (preg_match("/(^J-PHONE|^SoftBank|^Vodafone|^MOT)/", $agent)) {
      return "softbank";
    // au
    } elseif (preg_match("/(^KDDI|^UP\.Browser|^PDXGW)/", $agent)) {
      return "au";
    }
  }
  //--------------------------------------------------
  /**
   * カレンダーhtml取得
   *
   * @access  public
   * @param  string  $path      元URLパス
   * @param  array  $date      現在の日付["year", "mon", "mday"]
   * @param  array  $link      移動可能な日付(キーに日付を入れる)
   * @param  string  $dkey  option  キー名(デフォルト:date)
   * @return  string  $out      カレンダーHTML
   */
  function get_calendar($path, $date = "", $link = "", $dkey = "date")
  {
    if (!$date['year']) {
      $date['year'] = date("Y", time());
      $date['mon'] = date("m", time());
      $date['mday'] = date("d", time());
    }
    $date['yearfront'] = $date['year'];
    $date['yearafter'] = $date['year'];
    $date['monfront'] = $date['mon'] - 1;
    if ($date['mon'] == 1) {
      $date['monfront'] = 12;
      $date['yearfront']--; 
    }
    $date['monafter'] = $date['mon'] + 1;
    if ($date['mon'] == 12) {
      $date['monafter'] = 1;
      $date['yearafter']++; 
    }
    foreach ($date as $key => $value) {
      if (preg_match("/(mon|mday)/", $key)) {
        if ($date[$key] != 0) {
          $date[$key] = substr("0{$value}", -2, 2);
        }
      }
    }
    // URLの繋ぎ文字
    if (preg_match("/\?/", $path)) {
      $con = "&";
    } else {
      $con = "?";
    }
    $out .= "<table border='1'><tbody>";
    $out .= "<tr>";
    $out .= "<td><font size='2'><a href='{$path}{$con}{$dkey}={$date['yearfront']}{$date['monfront']}'>←</a></font></td>";
    $out .= "<td colspan='5'>";
    $out .= "<font size='2'><center><a href='{$path}{$con}{$dkey}={$date['year']}{$date['mon']}'>{$date['year']}年 ";
    $out .= "{$date['mon']}月</a></center></font></td>";
    $out .= "<td><font size='2'><a href='{$path}{$con}{$dkey}={$date['yearafter']}{$date['monafter']}'>→</a></font></td>";
    $out .= "</tr>";
    $out .= "<tr>";
    $out .= "<td><font size='2'>日</font></td>";
    $out .= "<td><font size='2'>月</font></td>";
    $out .= "<td><font size='2'>火</font></td>";
    $out .= "<td><font size='2'>水</font></td>";
    $out .= "<td><font size='2'>木</font></td>";
    $out .= "<td><font size='2'>金</font></td>";
    $out .= "<td><font size='2'>土</font></td>";
    $out .= "</tr>";
    $out .= "<tr>";
    $youbim1 = $this->get_calendar_youbi($date);
    
    for ($i = 1; $i <= $youbim1; $i++) {$out .= "<td > </td>";}
    $hi = array("", 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    for ($i = 1; $i <= $hi[floor($date['mon'])]; $i++) {
      $out .= "<td align='right'";
        // 今見ている日付の色を変える。
        if ($i == $date['mday']) {$out .= "bgcolor=#cccccc";}
      $out .= "><font size='2'>";
      if ($link[$i]) {
        $i2 = substr("0".$i, -2, 2);  // 右から2つ
        $out .= "<a href='{$path}{$con}{$dkey}={$date['year']}{$date['mon']}{$i2}'>$i</a>";
      } else {
        $out .= "$i";
      }
      $out .= "</font></td>";
      if ((($youbim1 + $i ) % 7) == 0) {$out .= "</tr><tr>";}
    }
    $out .= "</tr>";
    $out .= "</td></tr>";
    $out .= "</tbody></table>";
    return $out;
  }
  //--------------------------------------------------
  /**
   * 月の元日の曜日を取得
   * 上のカレンダーに依存
   *
   * @param  string  $data  {year, mon}    年月
   * @return  int     $youbim1 % 7      曜日番号
   */
  function get_calendar_youbi($date = "")
  {
    if (!$date['year']) {
      $date['year'] = date("Y", time());
      $date['mon'] = date("m", time());
      $date['mday'] = date("d", time());
    }
    $hi = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    $tosi = $date['year'];
    $tuki = $date['mon'];
    if ($tosi % 4 == 0) {
      if ($tosi % 100 == 0) {
        if ($tosi % 400 == 0) {$hi[2] = 29;}
      }
      else {$hi[2] = 29;}
    }
    $allhi = 0;
    if ($tuki >= 2) {
      for ($i = 1; $i<= $tuki - 1; $i++) {
        $allhi = $allhi + $hi[$i];
      }
    }
    $youbim1 = $tosi + $allhi;
    $youbim1 = $youbim1 + floor($tosi / 4);
    $youbim1 = $youbim1 - floor($tosi / 100);
    $youbim1 = $youbim1 + floor($tosi / 400);
    if ($hi[2] == 29) {$youbim1--;}
    return $youbim1 % 7;
  }
  //--------------------------------------------------
  /**
   * X文字以上の半角文字を削除
   *
   * @access  public
   * @param  string  $str  文字
   * @param  int    $value  番号
   * @return  string  $str  削除後文字
   */
  function del_hankaku($str, $value)
  {
    $str = preg_replace('/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#|?]{'.$value.',})/', , $str);
    return $str;
  }
  //--------------------------------------------------
  /**
   * X文字以上の半角文字を折り返し
   *
   * @access  public
   * @param  string  $str  文字
   * @param  int    $value  番号
   * @return  string  $str  折り返し入り文字
   */
  function br_hankaku($str, $value)
  {
    $str = preg_replace('/([-_.!~*\'()a-zA-Z0-9;\/:\@&=+\$,%#|]{'.$value.'})/', '$1<br>', $str);  // ?は自動改行されるので除く
    return $str;
  }
  //--------------------------------------------------
  /**
   * urlcheck
   *
   * @access  public
   * @param  string  $url    URL
   * @return  array  $rtn    [0]:否、[1]:可
   * @link  http://www.din.or.jp/~ohzaki/perl.htm#URI perlメモ
   */
  function url_check($url)
  {
    // $addr="s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+";
    $addr = "s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    $rtn = preg_match("/{$addr}/", $url);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * urlcheck_強め
   *
   * @access  public
   * @param  string  $url    URL
   * @return  array  $rtn    [0]:否、[1]:可
   */
  function url_check_hard($url)
  {
    if ($this->url_check($url)) {
      $addr = "s?https?:\/\/[^\.]*[\.][^\.]*";    // URL中に.を含まないものは排除
      $rtn = preg_match("/{$addr}/", $url);
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 正しい書式のメールアドレスの場合は、1 を返す
   *
   * @access  public
   * @param  string  $email  メール
   * @return  int    1 or 0
   * @link  http://q.hatena.ne.jp/1130649169
   */
  function mail_check($email)
  {
        if (preg_match('/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i', $email)) {
            return 1;
        }
        return 0;
  }
  //--------------------------------------------------
  /**
   * 配列のX番目からX個のみ取り出す
   *
   * @access  public
   * @param  array  $arr      元配列
   * @param  int    $start      取出初め
   * @param  int    $length  option  取出個数
   * @return  array  $rtn  option  取出配列
   */
  function array_substr($arr, $start = 0, $length = "")
  {
    $i = 0;
    $rtn = array();
    if ($arr) {
      foreach ($arr as $value) {
        if ($i >= $start && $i <= $length + $start) {
          array_push($rtn, $value);
        }
        $i++;
      }
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 文字列中のURLをAタグ化する
   *
   * @access  public
   * @param  string  $str      対象文字列
   * @param  string  $target  option  Aタグ化後のターゲット指定
   * @param  int    $nocomp  option  完全でないURLも許可("":完全のみ, 1:不完全を含む)
   * @return  string  $rtn      Aタグ化後の文字列
   */
  function str_to_atag($str, $target = "", $nocomp = "")
  {
    if ($target) {
      $target_str = "target=$target";
    }
    if ($nocomp) {
      $http = "h?t?tp";  // 不完全パターン
    } else {
      $http = "http";    // 完全パターン
    }
    $rtn = preg_replace("/({$http}s?:\/\/)([!#%&*+,\-.\/;=?\@_~0-9A-Za-z]+)\b/", "<a href='http://$2' $target_str>$1$2</a>", $str);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 色コードをランダムで作成
   *
   * @access  public
   * @return  string  $rtn  色文字列
   */
  function get_color_rand()
  {
    for ($k = 1; $k <= 6; $k++) {
      $i = floor(rand() % 6) * 3;
      if ($i == 10) {$i = 'a';}
      if ($i == 11) {$i = 'b';}
      if ($i == 12) {$i = 'c';}
      if ($i == 13) {$i = 'd';}
      if ($i == 14) {$i = 'e';}
      if ($i == 15) {$i = 'f';}
      $rtn = "{$rtn}{$i}";
    }
    $rtn = "#{$rtn}";
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * getパラメータをinputタグへ変更
   *
   * @access  public
   * @param  string  $param  get文字列
   * @return  string  $rtn  inputタグ
   */
  function geturl_to_inputtag($param)
  {
    $str= preg_replace("/^[\?\&]/", "", $param);
    $arr = split("&", $str);
    foreach ($arr as $val) {
      list($name, $value) = split("=", $val);
      $rtn .= "<input type=\"hidden\" name=\"{$name}\" value=\"{$value}\" />";
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * リダイレクト(呼び出され次第リダイレクト)
   *
   * @access  public
   * @param  string  $url
   * @return  void
   */
  function refresh($url)
  {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: ". $url);
    exit;
  }
  
  //--------------------------------------------------
  /**
   * 配列をinputタグへ変更
   *
   * @access  public
   * @param  array  $arr
   * @return  string  $rtn
   */
  function array_to_inputtag($arr)
  {
    foreach ($arr as $name => $value) {
      $rtn .= "<input type=\"hidden\" name=\"{$name}\" value=\"{$value}\" />";
    }
    return $rtn;
  }
  //--------------------------------------------------------------
  /**
   * ファイルを追加書き込み
   *
   * @access  public
   * @param  string  $filename  ファイル名
   * @param  string  $value    書込データ
   * @return  void
   */
  function set_file_add($filename, $value)
  {
    //書き込みモードでファイルを開く
    if (!$handle = fopen($filename, 'a')) {
      return;
    }
    if (fwrite($handle, $value."\r\n") === FALSE) {
      return;
    }
    fclose($handle);
  }
  //--------------------------------------------------------------
  /**
   * kizasiトップワード取得(30ワード取得)
   *
   * @access  public
   * @param  string  $code  変換後の文字コード
   * @return  array  $arr  取得データ  {title=>, description=>}
   */
  function get_kizasi_word($code = "")
  {
    if (!$code) {
      $code = "shift-jis";  // 取得するデータの文字コード
    }
    $kizasi_code = "UTF-8";  // kizasiの文字コード
    
    $html = $this->gethtml("http://kizasi.jp/rss.xml");
    $xml = new SimpleXMLElement($html);
    /* channel/item/ を探します */
    $result = $xml->xpath('channel/item');
    $arr = array();
    foreach ($result as $value) {
      if ($kizasi_code != $code) {
        $value = $this->mb_convert_encoding_arr($value, $code, $kizasi_code);
      }
      $value['description'] = $this->text_to_del_tag($value['description'], "a");  // descriptionにAタグが入っているので削除
      array_push($arr, $value);
    }
    return $arr;
  }
  //--------------------------------------------------------------
  /**
   * ヤフー急上昇ワード
   *
   * @access  public
   * @param  string  $code  変換後の文字コード
   * @return  $arr  {title=>, description=>}
   * @link  http://searchranking.yahoo.co.jp/burst_ranking
   */
  function get_yahoo_word($code = "")
  {
    if (!$code) {
      $code = "shift-jis";  // 取得するデータの文字コード
    }
    $front_code = "UTF-8";  // 変換前の文字コード
    
    $html = $this->gethtml("http://searchranking.yahoo.co.jp/rss/burst_ranking-rss.xml");
    $xml = new SimpleXMLElement($html);
    /* channel/item を探します */
    $result = $xml->xpath('channel/item');
    $arr = array();
    foreach ($result as $value) {
      if ($front_code != $code) {
        $value = $this->mb_convert_encoding_arr($value, $code, $front_code);
      }
      array_push($arr, $value);
    }
    return $arr;
  }
  //--------------------------------------------------------------
  /**
   * google急上昇ワード(20ワード取得)
   *
   * @access  public
   * @param  string  $code  変換後の文字コード
   * @return  $arr  {title=>, description=>}
   */
  function get_google_word($code = "")
  {
    if (!$code) {
      $code = "shift-jis";  // 取得するデータの文字コード
    }
    $front_code = "UTF-8";  // 変換前の文字コード
    
    $html = $this->gethtml("http://www.google.com/m/services/trends/get");
    
    $xml = new SimpleXMLElement($html);
    /* item を探します */
    $result = $xml->xpath('item');
    // [query] => ***,[rank] => 4,[prev_rank] => 7,[score] => 106.03,[snippet] => ***,
    
    $arr = array();
    foreach ($result as $value) {
      if ($front_code != $code) {
        $value = $this->mb_convert_encoding_arr($value, $code, $front_code);
      }
      // 他のワードとの互換のため
      $temp['title'] = $value['query'];
      $temp['description'] = $value['snippet'];
      array_push($arr, $temp);
    }
    return $arr;
  }
  //--------------------------------------------------------------
  /**
   * 配列データの文字コードを一括変換
   *
   * @access  public
   * @param  $arr    変換前データ
   * @param  $code    変換後文字コード
   * @param  $front_code  変換前文字コード
   * @return  $arr
   */
  function mb_convert_encoding_arr($arr, $code, $front_code)
  {
    $rtn = array();
    foreach ($arr as $key => $value) {
      $rtn[$key] = mb_convert_encoding($value, $code, $front_code);
    }
    return $rtn;
  }
  //--------------------------------------------------------------
  /**
   * 文字列を省略する
   *
   * @access  public
   * @param  $str      文字列
   * @param  $num      省略幅
   * @param  $code  option  文字コード
   * @return  $rtn
   */
  function str_ryaku($str, $num, $code = "")
  {
    if ($code == "") { $code = "shift-jis"; }
    $rtn = mb_strimwidth($str, 0, $num, "...", $code);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * データにurlを含むとき1
   *
   * @access  public
   * @param  string  $data  データ
   * @return  int    $rtn  0:含まない, 1:含む
   */
  function chk_url_data($data)
  {
    if (preg_match("/tp:\/\//", $data)) {
      $rtn = 1;
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 正規化したURLを取得
   *
   * @access  public
   * @param  string  $url  正規化前URL
   * @return  string  $url  正規化後URL
   */
  function get_preg_url($url)
  {
    $addr = "[-_.!~*'()a-zA-Z0-9;\/\?:@&=+$,%#]+";
    preg_match("/({$addr})/", $url, $matches);
    $url = $matches[1];
    $url = preg_replace("/^(http|ttp|tp|p):\/\//", "", $url);
    $url = "http://{$url}";
    return $url;
  }
  //--------------------------------------------------
  /**
   * ファイルからtab区切りのデータ取得
   *
   * @access  public
   * @param   string  $filename  ファイル名
   * @return  array  $rtn    配列データ
   */
  function get_file_tab($filename)
  {
    $data = $this->get_file_data($filename);
    $arr = preg_split("/(\t|\r\n|\r|\n)/", $data);
    foreach ($arr as $value) {
      if ($value) {
        preg_match("/^([\w\d]*)=/", $value, $matches);
        $key = $matches[1];
        $item = str_replace("{$key}=", "", $value);
        $rtn[$key] = $item;
      }
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * ファイルへtab区切りのデータを設定
   *
   * @access  public
   * @param  string  $filename  ファイル名
   * @param  array  $data    配列データ
   * @return  void
   */
  function set_file_tab($filename, $data)
  {
    $str = "";
    if ($data) {
      foreach ($data as $key => $value) {
        $str .= "{$key}={$value}\t";
      }
    }
    $this->set_file_data($filename, $str);
  }
  //--------------------------------------------------
  /**
   * スパムデータ判定
   *
   * @access  public
   * @param  string  $str  判定元データ
   * @return  int    $rtn  0:無し, 1:有り
   */
  function chk_spam_data($str)
  {
    if (preg_match("/^([\w\d\s-_.!~*'();\/\?:@&=+$,%#<>\"]*)$/", $str)) {
      $rtn = 1;
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * googleページランク取得(未使用)
   *
   * @param  string  $url  URL
   * @param  string  $code  変換後の文字コード
   * @return  int    $rtn  ページランク
   */
  function get_page_rank_bk($url, $code = "")
  {
    if (!$code) {
      $code = "shift-jis";  // 取得するデータの文字コード
    }
    $front_code = "UTF-8";  // 変換前の文字コード
    $url = urlencode($url);
    $html = $this->gethtml("http://www.trynt.com/google-pagerank-api/v1/?u={$url}");
    $xml = new SimpleXMLElement($html);
    /* Pagerank を探します */
    $result = $xml->xpath('Pagerank');
    $rtn = $result[0];
    $rtn = mb_convert_encoding($rtn, $code, $front_code);
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * googlePageRank配列取得
   *
   * @access  public
   * @param  array  $url          URL
   * @param  string  $code          文字コード
   * @return  array  $rtn[]{url, pagerank}  ページランクデータ
   * @link  http://www.gssm.musashi.ac.jp/~ono/grank/index.html
   */
  function get_page_rank_arr($url, $code = "")
  {
    if ($url) {
      if (is_array($url)) {
        foreach ($url as $value) {
          $url_temp .= $value."\n";
        }
        $url = $url_temp;
      }
      $url = urlencode($url);
      $target = "http://www.gssm.musashi.ac.jp/~ono/grank/cgi-bin/google_pagerank.cgi?url={$url}";
      $html = $this->gethtml($target);
      $start = strpos($html, "<table");
      $len = strpos($html, "</table>") - $start;
      $html = substr($html, $start, $len);
      
      $html = preg_replace("/<tr>/", "\n", $html);  // 改行追加
      $html = $this->text_to_del_tag($html);    // タグ削除
      
      $arr = preg_split("/\n/", $html);
      $rtn = array();
      foreach ($arr as $value) {
        list($temp['pagerank'], $temp['url']) = split(" ", $value);
        // URLがある
        if ($temp['url']) {
          // ページランクが空のときは0を入れる
          if (!$temp['pagerank']) {$temp['pagerank'] = 0;}
          // ページランクが数字のとき
          if (is_numeric($temp['pagerank'])) {
            array_push($rtn, $temp);  // 配列へ格納
          }
        }
      }
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * google検索結果取得
   *
   * @access  public
   * @param  string  $word          取得ワード
   * @param  int    $page  option      取得ページ数
   * @return  array  $result[]{url, title}  検索結果
   */
  function get_google_search_result($word, $page = "")
  {
    $word = urlencode($word);
    if ($page >= 1) {
      $start = ($page-1) * 10;
      $plus = "&start={$start}&";
    }
    $url = "http://www.google.co.jp/search?hl=ja&q={$word}&lr=$plus";
    $html = $this->gethtml($url);
    $html = substr($html, strpos($html, "<h2 class=hd>検索結果"));
    $html = preg_replace("/<[\/]?em>/", "", $html);
    $html = preg_replace("/<[\/]?b>/", "", $html);
    $html = str_replace("class=l", "", $html);
    $html = preg_replace("/onmousedown=\"return clk\(this.href,,,'res','[\d]*',\)\"/", "", $html);
    
    $atag = $this->text_to_tag_a($html);
    $result = array();
    foreach ($atag[0] as $key => $value) {
      $result[$key]['url'] = $atag[1][$key];
      $result[$key]['title'] = $atag[2][$key];
    }
    // ヘッダのイメージ検索リンクを削除
    if (preg_match("/^http:\/\/images.google.co.jp\/images?/", $result[0]['url'])) {
      array_shift($result);  // 前除く
    }
    // フッターの関連リンクを削除
    if (count($result) > 10) {
      while(count($result) > 10) {
        array_pop($result);  // 後除く
      }
    }
    return $result;
  }
  //--------------------------------------------------
  /**
   * ある文字列に挟まれた文字列を取得
   *
   * @access  public
   * @param  string  $str  対象文字列
   * @param  string  $start  最初の検索文字列
   * @param  string  $end  最後の検索文字列
   * @return  string  $mid  取得文字列
   */
  function get_mid_str($str, $start, $end)
  {
    $s = strpos($str, $start) + strlen($start);
    $str = substr($str, $s);
    $e = strpos($str, $end);
    $mid = substr($str, 0, $e);
    return $mid;
  }
  //--------------------------------------------------
  /**
   * ある文字列に挟まれた文字列を削除して返す
   *
   * @access  public
   * @param  string  $str  対象文字列
   * @param  string  $start  最初の検索文字列
   * @param  string  $end  最後の検索文字列
   * @return  string  $rtn  取得文字列
   */
  function del_mid_str($str, $start, $end)
  {
    $s = strpos($str, $start);
    $str1 = substr($str, 0, $s);
    $s = strpos($str, $start) + strlen($start);
    $str2 = substr($str, $s);
    $e = strpos($str2, $end) + strlen($end);
    $str2 = substr($str2, $e);
    $rtn = $str1.$str2;
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * 指定した文字列の間の文字列を取得
   *
   * @access  public
   * @param  string  $str  対象文字列
   * @param  string  $point  後文字(*)後文字
   * @return  string  $str  取得文字列
   */
  function get_mid_str_kakko($str, $point)
  {
    list($start, $end) = split("\(\*\)", $point);
    $str = $this->get_mid_str($str, $start, $end);  // ある文字列に挟まれた文字列を取得
    return $str;
  }
  //--------------------------------------------------
  /**
   * 指定した文字列の間の文字列を排除して取得
   *
   * @access  public
   * @param  string  $str  対象文字列
   * @param  string  $point  後文字(*)後文字
   * @return  string  $str  取得文字列
   */
  function del_mid_str_kakko($str, $point)
  {
    list($start, $end) = split("\(\*\)", $point);
    $str = $this->del_mid_str($str, $start, $end);  // ある文字列に挟まれた文字列を排除
    return $str;
  }
  //--------------------------------------------------
  /**
   * URLのパラメータ文字列を配列に変換
   *
   * @access  public
   * @param  string  $URL  文字列
   * @return  array  $hash  パラメータのハッシュデータ
   */
  function url_to_param_arr($url)
  {
    $hash = array();
    if ($url) {
      list($path, $params) = split("\?", $url);
      if ($params) {
        $arr = split("&", $params);
        if ($arr) {
          foreach ($arr as $value) {
            list($name, $data) = split("=", $value);
            $hash[$name] = $data;
          }
        }
      }
    }
    return $hash;
  }
  //--------------------------------------------------
  /**
   * URLからドメイン名を取得する
   *
   * @access  public
   * @param  string  $url  URL
   * @return  string  $domain  ドメイン名
   * @ex    http://www.google.com → google.com
   */
  function url_to_domain($url)
  {
    $url = str_replace("http://", "", $url);
    $arr = split("\/", $url);
    $arr2 = split("\.", $arr[0]);
    foreach ($arr2 as $key => $value) {
      if ($key != 0) {
        $domain .= $value.".";
      }
    }
    $domain = substr($domain, 0, -1);  // 最後の.を削除
    return $domain;
  }
  //--------------------------------------------------
  /**
   * ファイルに記載されているUnixtimeと現在の日時を比較
   * ~秒経過してれば、1を返す
   *
   * @access  public
   * @param  string    $file  ファイル名
   * @param  int      $sec  経過時間
   * @return  int      $rtn  1:経過, 0:経過せず
   */
  function chk_file_time($file, $sec)
  {
    if (file_exists($file)) {
      $filedate = $this->get_file_data($file); // 更新日付取得
    }
    $rtn = 0;
    if (time() >= $filedate +$sec) {  // x秒以内に更新が無かった時
      $this->set_file_data($file, time());  // 保存
      $rtn = 1;
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * ロボットクローラ対策で静的ページを偽装
   *
   * @access  public
   * @return  void
   */
  function set_last_modified()
  {
    $time = time() - time() % (60 * 60);
    header( "Last-Modified: " . gmdate( "D, d M Y H:i:s", $time ) . " GMT" );
  }
  //--------------------------------------------------
  /**
   * 検索エンジンから来た時の検索ワードを取得
   *
   * @param  string  $encode  変換したい文字コード
   * @retrun  array  $rtn  {word=>ワード, engine=>検索エンジン名}
   * @link  http://edu.nuts-choco.com/blog/archives/d9372c29dfeb509f1bafbbe1521283dffa374bd2.php
   */
  function get_engine_word($encode = "SJIS")
  {
    $url = $_SERVER["HTTP_REFERER"];
    /*
    $url = "http://search.yahoo.co.jp/search?p=%E3%83%A4%E3%83%95%E3%83%BC&ei=UTF-8&fr=top_ga1&x=wrt";        // ヤフー
    $url = "http://www.google.co.jp/search?hl=ja&q=%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB&btnG=%E6%A4%9C%E7%B4%A2&lr=";    // グーグル
    $url = "http://kotochu.fresheye.com/search/?kw=%E3%82%B3%E3%83%88%E3%83%90%E3%82%A6%E3%83%81%E3%83%A5%E3%82%A6&cs=utf8&x=18&y=5";        // fresheye コトバウチュウ
    $url = "http://search.goo.ne.jp/web.jsp?SGT=0&from=query&MT=%A5%B0%A1%BC&DC=10";      // goo グー
    $url = "http://search.nifty.com/websearch/search?cflg=%E6%A4%9C%E7%B4%A2&select=2&q=%E3%83%8B%E3%83%95%E3%83%86%E3%82%A3&ck=&ss=up";    // nifty ニフティ
    $url = "http://search.livedoor.com/search/?c=ld_top_sb_2&q=%A5%E9%A5%A4%A5%D6%A5%C9%A5%A2&lr=lang_ja";    // livedoor ライブドア
    $url = "http://www.excite.co.jp/search.gw?search=%83G%83L%83T%83C%83g&target=combined&look=excite_jp&Language=";    // excite  エキサイト ??
    $url = "http://search.www.infoseek.co.jp/Web?col=OW&qt=%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A9&wd=0&svx=101102";    // infoseek    インフォ
    */
    
    if ($url) {
      if (preg_match("/^http:\/\/(www)?\.?google.*/i", $url)) {  // Google
        $word = preg_replace("/^.*[\?&]q=([^&]+)&?.*$/i", "$1", $url);
        $engine = "google";
      } elseif (preg_match("/^http:\/\/search\.yahoo.*/i", $url)) {  // Yahoo
        $word = preg_replace("/^.*[\?&]p=([^&]+)&?.*$/i", "$1", $url);
        $engine = "yahoo";
      } elseif (preg_match("/^http:\/\/search\.msn.*/i", $url)) {    // MSN
        $word = preg_replace("/^.*[\?&]q=([^&]+)&?.*$/i", "$1", $url);
        $engine = "msn";
      } elseif (preg_match("/^http:\/\/search\.www\.infoseek.*/i", $url)) {  // infoseek    auto
        $word = preg_replace("/^.*[\?&]qt=([^&]+)&?.*$/i", "$1", $url);
        $engine = "infoseek";
      } elseif (preg_match("/^http:\/\/(www|sleipnir)\.excite.*/i", $url)) {  // excite
        $word = preg_replace("/^.*[\?&]search=([^&]+)&?.*$/i", "$1", $url);
        $engine = "excite";
      } elseif (preg_match("/^http:\/\/search\.livedoor.*/i", $url)) {  // livedoor    euc-jp
        $word = preg_replace("/^.*[\?&]q=([^&]+)&?.*$/i", "$1", $url);
        $engine = "livedoor";
      } elseif (preg_match("/^http:\/\/(search|so-net\.mobile)\.goo.*/i", $url)) {  // goo
        $word = preg_replace("/^.*[\?&]MT=([^&]+)&?.*$/i", "$1", $url);
        $engine = "goo";
      } elseif (preg_match("/^http:\/\/search\.nifty.*/i", $url)) {  // nifty
        $word = preg_replace("/^.*[\?&]q=([^&]+)&?.*$/i", "$1", $url);
        $engine = "nifty";
      } elseif (preg_match("/^http:\/\/search\.lycos.*/i", $url)) {  // Lycos
        $word = preg_replace("/^.*[\?&]query=([^&]+)&?.*$/i", "$1", $url);
        $engine = "lycos";
      } elseif (preg_match("/^http:\/\/(search|kotochu)\.fresheye.*/i", $url)) {  // fresheye
        $word = preg_replace("/^.*[\?&]kw=([^&]+)&?.*$/i", "$1", $url);
        $engine = "fresheye";
      } elseif (preg_match("/^http:\/\/(www\.)?alltheweb.*/i", $url)) {  // AllTheWeb
        $word = preg_replace("/^.*[\?&]q=([^&]+)&?.*$/i", "$1", $url);
        $engine = "alltheweb";
      }
      $word = urldecode($word);
      
      // 検索ワードの元々の文字コード
      if (preg_match("/euc/", $url)) {$from = "euc-jp";}
      elseif (preg_match("/utf-8/i", $url)) {$from = "utf-8";}
      else {$from = "auto";}
      $word = mb_convert_encoding($word, $encode, $from);
      $rtn['word'] = $word;
      $rtn['engine'] = $engine;
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * ロボット判定
   *
   * @access  public
   * @return  int    $rtn  1 or 0
   */
  function is_robot()
  {
    $remote = gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']);
    if (!$remote) {
      $remote = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    }
    // $remote = "{$_SERVER['HTTP_VIA']},{$_SERVER['HTTP_FORWARDED']},{$_SERVER['HTTP_X_FORWARDED_FOR']}";
    if (preg_match("/.search.msn.com$|.googlebot.com$|.amazon.com$|^125.100.100.105$|.search.ogk.yahoo.co.jp$|.compute-1.amazonaws.com$/", $remote)) {
      // ロボット
      $rtn = 1;
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * リモートホスト取得
   * プロキシごしでもOK
   *
   * @access  public
   * @return  string  $remote    ホスト名
   */
  function get_remote_host()
  {
    $remote = gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']);
    if (!$remote || !preg_match("/^[\d\.]+$/", $remote)) {
      $remote = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    }
    return $remote;
  }
  //--------------------------------------------------
  /**
   * dir内のファイル名一覧を取得(サブフォルダも含む)
   * 再起処理
   *
   * @access  public
   * @param   string  $path    フィルダ・ファイルパス
   * @return  array  $rtn    フォルダ内のファイル名を指定した$pathからのパスで取得
   * 
   */
  function get_dir_file_sub($path)
  {
    $rtn = array();
    if (filetype($path) == "file") {
      array_push($rtn, $path);
    } elseif (filetype($path) == "dir") {
      $handle = openDir($path);
      while (false !== $name = readDir($handle)) {
        if ($name != "." && $name != "..") {
          $rtn = array_merge($rtn, $this->get_dir_file_sub($path."/".$name));
        }
      }
    }
    return $rtn;
  }
  //--------------------------------------------------
  /**
   * ログセット
   * 時間+ログ
   *
   * @access  public
   * @param  string  $filename  ファイル名
   * @param  string  $value    ログ
   * @return  void
   */
  function set_log($filename, $value)
  {
    $value = date("Y/m/d H:i:s", time()) ." ". $value;
    $this->set_file_add($filename, $value);
  }
  //--------------------------------------------------
  /**
   * ディレクトリロック
   *
   * @access  public
   * @param  string  $name  ロックdir名
   * @return  boolean      0, 1
   */
  function lock_dir($name = "")
  {
    if ($name == "") $name = "lock";//"lock/lock.lck"
    // 10分以上前のディレクトリなら解除失敗とみなして削除
    if ((file_exists($name)) && filemtime($name) < time() - 600) {
      rmdir($name);
    }
    do {
      if (mkdir($name, 0777)) {
        return 1;
      }
      sleep(1);  // 一秒待って再トライ
      $i++;
    } while ($i < 5);
    return 0;
  }
  //--------------------------------------------------
  /**
   * ロック解除
   *
   * @access  public
   * @param  string  $name  ロックdir名
   */
  function unlock_dir($name = "")
  {
    if ($name == "") $name = "lock";
    rmdir($name);
  }
  //--------------------------------------------------
  // ヤフーカテゴリデータ取得
  function get_yahoo_cate_data($target)
  {
    $text = $this->gethtml($target);
    $text = $this->get_mid_str($text, 'sitesorted">', '/.sitesorted');
    $text = mb_convert_encoding($text, "sjis", "euc-jp");
    $a_arr = $this->text_to_tag_a($text);
    $items = array();
    foreach ($a_arr[1] as $key => $a) {
      if (!preg_match("!http://picks\.dir\.yahoo\.co\.jp!", $a)) {
        unset($item);
        $item['url'] = $a_arr[1][$key];
        $item['title'] = $a_arr[2][$key];
      }
      array_push($items, $item);
    }
    return $items;
  }
  //--------------------------------------------------
  /**
   * csvファイル読み込み
   *
   * @param  string  $file  ファイル名
   * @return  array  $rec  csvデータ
   */
  function get_file_csv($file)
  {
    //fgetcsvだと適切に区切られない
    /*
    $handle = fopen($file, "r");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $rec[] = $data;
    }
    fclose($handle);
    */
    $arr = $this->get_file_array($file);
    foreach ($arr as $key => $line) {
      $value = explode(",", $line);
      $rec[$key] = $value;
    }
    return $rec;
  }
  //--------------------------------------------------
  // htmlspecialcharsの逆(php4非サポート)
  function htmlspecialchars_decode($str)
  {
    $str = str_replace("&", "&", $str);
    $str = str_replace(">", ">", $str);
    $str = str_replace("<", "<", $str);
    
    return $str;
  }
  //--------------------------------------------------
  // サイトマップ出力
  function set_sitemap_file($file, $urls)
  {
    $out = "";
    foreach ($urls as $url) {
      $url = htmlentities($url);  // エスケープ
$out .=<<<EOD
   <url>
      <loc>{$url}</loc>
      <changefreq>weekly</changefreq>
      <priority>0.5</priority>
   </url>
EOD;
    }
$out =<<<EOD
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{$out}</urlset>
EOD;
    $this->set_file_data($file, $out);
  }
  //--------------------------------------------------
  /**
   * ディレクトリ存在チェック
   *
   * @param  string  $path
   * @return  int    0 or 1
   */
  function isDir($path)
  {
    if (is_dir($path)) {
      return 1;
    }
    return 0;
  }
  //--------------------------------------------------
  /**
   * ディレクトリが無ければ作成
   *
   * @param  string  $path
   */
  function makeDir($path)
  {
    $tmp = explode("/", $path);
    foreach ($tmp as $key => $name) {
      $make .= $name;
      if (!is_dir($make) && $make && count($tmp) - 2 >= $key) {
        mkdir($make);
      }
      $make .= "/";
    }
  }
  //--------------------------------------------------
}
//--------------------------------------------------
?>