1

PHPには、のようなものをにrealpath()変換できる素晴らしい関数があります。この関数の「問題」は、 が実際のファイルではなく、単に別のファイルへのリンクである場合、PHP がそのリンクをたどって実際のファイルの実際のパスを返すことです。/dir1/dir2/../dir3/filename/dir1/dir3/filename/dir1/dir3/filename

ただし、実際にはリンク自体の実際のパスを取得する必要があります。/dir/..必要なのは、パスのような複雑さを解決することだけです。どうすればいいですか?

4

3 に答える 3

1

要件に合わせて関数を作成しました。

function realpath_no_follow_link($str) {
  if (is_link($str)) {
    $pathinfo = pathinfo($str);
    return realpath_no_follow_link($pathinfo['dirname']) . '/' .$pathinfo['basename'];
  }
  return realpath($str);
}
于 2012-08-23T08:14:23.027 に答える
0

それを行う既存のPHP関数、またはxdazzの答えに沿った単純なものを見つけたいと思っていました(しかし、それは実際には私が望むように機能します)。そのような答えを見つけることができなかったので、私は自分の汚い関数を書きました。改善のためのコメントや提案をいただければ幸いです。

// return the contracted path (e.g. '/dir1/dir2/../dir3/filename' => '/dir1/dir3/filename')
// $path: an absolute or relative path
// $rel: the base $path is given relatively to - if $path is a relative path; NULL would take the current working directory as base
// return: the contracted path, or FALSE if $path is invalid
function contract_path($path, $rel = NULL) {
  if($path == '') return FALSE;
  if($path == '/') return '/';
  if($path[strlen($path) - 1] == '/') $path = substr($path, 0, strlen($path) - 1); // strip trailing slash
  if($path[0] != '/') { // if $path is a relative path
    if(is_null($rel)) $rel = getcwd();
    if($rel[strlen($rel) - 1] != '/') $rel .= '/';
    $path = $rel . $path;
  }
  $comps = explode('/', substr($path, 1)); // strip initial slash and extract path components
  $res = Array();
  foreach($comps as $comp) {
    if($comp == '') return FALSE; // double slash - invalid path
    if($comp == '..') {
      if(count($res) == 0) return FALSE; // parent directory of root - invalid path
      array_pop($res);
    }
    elseif($comp != '.') $res[] = $comp;
  }
  return '/' . implode('/', $res);
}
于 2012-08-27T00:14:43.420 に答える
-3

abspath() 関数を試すことができます。

于 2012-08-23T08:03:05.293 に答える