PHP dosya sistemi yol dizeleri katılmak için nasıl?

9 Cevap php

Akıllıca yol dizeleri katılmak için PHP yerleşik bir işlevi var mı? Fonksiyonu, argüman olarak "abc / de /" ve "/ FG / x.php" verilen "abc / de / fg / x.php" dönmelidir; aynı sonuç "abc / de" ve bu işlev için bağımsız değişken olarak "fg / x.php" kullanılarak verilmelidir.

Değilse, kullanılabilir bir sınıf var mı? Ayrıca yolları bölme veya bunların parçaları kaldırmak için değerli olabilir. Bir şey yazılı varsa, buradan kodunuzu paylaşabilir?

Ben sadece Linux için kodlama ediyorum, her zaman "/" kullanmak için ok.

Python, hangi büyük os.path.join() var.

9 Cevap

Bu popüler bir soru gibi görünüyor ve yorumlar "özellikleri önerileri" veya "hata raporları" ile dolduran beri ... Tüm bu kod parçacığını aralarında bölü çoğaltma olmadan bir çizgi ile iki dizeleri join yapar. Hepsi bu. Hayır daha az. Bu sabit disk üzerinde gerçek yollarını değerlendirmek değil ne de aslında başlayan çizgi (gerekirse, en azından bu kodu her zaman bir dize without başlayan çizgi döner emin olabilirsiniz bu geri eklemek) tutmak yok.

join('/', array(trim("abc/de/", '/'), trim("/fg/x.php", '/')));

Sonuçta her zaman başında veya sonunda hiçbir bölü ve içinde hiçbir çift bölü ile bir yol olacaktır. Bunun dışında bir işlevi yapmak için çekinmeyin.

EDIT: Here's a nice flexible function wrapper for above snippet. You can pass as many path snippets as you want, either as array or separate arguments:

function joinPaths() {
    $args = func_get_args();
    $paths = array();
    foreach ($args as $arg) {
        $paths = array_merge($paths, (array)$arg);
    }

    $paths = array_map(create_function('$p', 'return trim($p, "/");'), $paths);
    $paths = array_filter($paths);
    return join('/', $paths);
}

echo joinPaths(array('my/path', 'is', '/an/array'));
//or
echo joinPaths('my/paths/', '/are/', 'a/r/g/u/m/e/n/t/s/');

: O)

function join_paths() {
    $paths = array();

    foreach (func_get_args() as $arg) {
        if ($arg !== '') { $paths[] = $arg; }
    }

    return preg_replace('#/+#','/',join('/', $paths));
}

Benim çözüm eser os.path.join basit ve yol Python daha benzer

Bu test durumları dikkate

array               my version    @deceze      @david_miller    @mark

['','']             ''            ''           '/'              '/'
['','/']            '/'           ''           '/'              '/'
['/','a']           '/a'          'a'          '//a'            '/a'
['/','/a']          '/a'          'a'          '//a'            '//a'
['abc','def']       'abc/def'     'abc/def'    'abc/def'        'abc/def'
['abc','/def']      'abc/def'     'abc/def'    'abc/def'        'abc//def'
['/abc','def']      '/abc/def'    'abc/def'    '/abc/def'       '/abc/def'
['','foo.jpg']      'foo.jpg'     'foo.jpg'    '/foo.jpg'       '/foo.jpg'
['dir','0','a.jpg'] 'dir/0/a.jpg' 'dir/a.jpg'  'dir/0/a.jpg'    'dir/0/a.txt'

Örneğin, bir Unix mutlak yolu ile başlayan bir yol katılmaya çalışırken @ deceze fonksiyonu / lider tutmaz joinPaths('/var/www', '/vhosts/site');.

function unix_path() {
  $args = func_get_args();
  $paths = array();

  foreach($args as $arg) {
    $paths = array_merge($paths, (array)$arg);
  }

  foreach($paths as &$path) {
    $path = trim($path, '/');
  }

  if (substr($args[0], 0, 1) == '/') {
    $paths[0] = '/' . $paths[0];
  }

  return join('/', $paths);
}

Benim alabilir:

function trimds($s) {
    return rtrim($s,DIRECTORY_SEPARATOR);
}

function joinpaths() {
    return implode(DIRECTORY_SEPARATOR, array_map('trimds', func_get_args()));
}

I trimds için bir anonim işlev kullanılmış olurdu, ancak PHP'nin eski sürümleri bunu desteklemez.

Örnek:

join_paths('a','\\b','/c','d/','/e/','f.jpg'); // a\b\c\d\e\f.jpg (on Windows)

Güncelleştirme April 2013 March 2014,

function join_paths() {
    return preg_replace('~[/\\\]+~', DIRECTORY_SEPARATOR, implode(DIRECTORY_SEPARATOR, func_get_args()));
}

Bu senin OS maç için herhangi bir eğik düzeltecektir, bir lider eğik çizgi kaldırmak ve temizlemek ve bir satırda birden bölü olmaz.

Alternatif bir implode() ile ve explode(). Olduğu

$a = '/a/bc/def/';
$b = '/q/rs/tuv/path.xml';

$path = implode('/',array_filter(explode('/', $a . $b)));

echo $path;  // -> a/bc/def/q/rs/tuv/path.xml

Bu bir saldıran farklı bir yolu:

function joinPaths() {
  $paths = array_filter(func_get_args());
  return preg_replace('#/{2,}#', '/', implode('/', $paths));
}

for getting parts of paths you can use pathinfo http://nz2.php.net/manual/en/function.pathinfo.php

@ deceze gelen yanıtı birleştirilmesi için güzel görünüyor

Bu deceze tarafından yayınlanmıştır fonksiyonunun düzeltilmiş versiyonu. Bu değişiklik olmadan, joinPaths ('', 'foo.jpg') / foo.jpg 'olur

function joinPaths() {
    $args = func_get_args();
    $paths = array();
    foreach ($args as $arg)
        $paths = array_merge($paths, (array)$arg);

    $paths2 = array();
    foreach ($paths as $i=>$path)
    {   $path = trim($path, '/');
        if (strlen($path))
            $paths2[]= $path;
    }
    $result = join('/', $paths2); // If first element of old path was absolute, make this one absolute also
    if (strlen($paths[0]) && substr($paths[0], 0, 1) == '/')
        return '/'.$result;
    return $result;
}

Eğer dosya / dizin var biliyorum varsa, (o gereksiz olabilir) ekstra eğik çizgi ekleyebilirsiniz, daha sonra realpath diyoruz, yani

realpath(join('/', $parts));

Bu elbette Python sürümü oldukça aynı şey değildir, ama birçok durumda yeterli olabilir.