Làm thế nào để nối các chuỗi đường dẫn hệ thống tệp trong PHP?


76

Có một hàm nội trang trong PHP để nối các chuỗi đường dẫn một cách thông minh không? Hàm, đã cho abc/de//fg/x.phpdưới dạng đối số, sẽ trả về abc/de/fg/x.php; kết quả tương tự sẽ được đưa ra bằng cách sử dụng abc/defg/x.phplàm đối số cho hàm đó.

Nếu không, có một lớp học có sẵn không? Nó cũng có thể có giá trị để chia nhỏ các đường dẫn hoặc loại bỏ các phần của chúng. Nếu bạn đã viết một cái gì đó, bạn có thể chia sẻ mã của bạn ở đây?

Sử dụng luôn cũng được /, tôi chỉ viết mã cho Linux.

Trong Python có os.path.join, điều đó thật tuyệt.


5
Chà, tôi vừa đến đây từ Google. Không thể tin được PHP lại như thế này.
Dmitry Minkovsky,

4
Lưu ý rằng ví dụ của bạn khá sai lệch vì os.path.join('some/relative/path, '/an/absolute/path')sẽ luôn trả về /an/absolute/path. Vì vậy, bạn đang tìm kiếm một sự os.path.jointhay thế (sau đó sửa chữa ví dụ của bạn) hoặc một cái gì đó gần với nó, ngoại trừ các đường dẫn tuyệt đối đến thứ hai (hoặc thứ n) được coi là đường dẫn tương đối.

2
@Tibo và những người ủng hộ nhận xét của anh ấy: không, ví dụ này không gây hiểu lầm chút nào, ngoại trừ trường hợp người ta bỏ qua ý chính của câu hỏi và nhấn mạnh quá mức về tham chiếu Python, đây là một nhận xét ngoài lề cho định hướng. Câu hỏi là hoàn toàn rõ ràng về những gì nó muốn, mà là không chính xác os.path.join. Đọc: "Hàm, đã cho abc/de//fg/x.phpdưới dạng đối số, sẽ trả về abc/de/fg/x.php".
Sz.

Người ta kinh tởm rằng PHP không có một hàm dựng sẵn cho việc này
Silidrone

Câu trả lời:


54

Vì đây có vẻ là một câu hỏi phổ biến và các nhận xét chứa đầy "đề xuất tính năng" hoặc "báo cáo lỗi" ... Tất cả những gì đoạn mã này làm là nối hai chuỗi với dấu gạch chéo mà không có dấu gạch chéo trùng lặp giữa chúng. Đó là tất cả. Không nhiều không ít. Nó không đánh giá các đường dẫn thực tế trên đĩa cứng cũng như không thực sự giữ dấu gạch chéo đầu (thêm dấu gạch chéo vào nếu cần, ít nhất bạn có thể chắc chắn rằng mã này luôn trả về một chuỗi mà không có dấu gạch chéo bắt đầu).

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

Kết quả cuối cùng sẽ luôn là một con đường không có dấu gạch chéo ở đầu hoặc cuối và không có dấu gạch chéo kép bên trong. Hãy thoải mái tạo ra một chức năng từ đó.

CHỈNH SỬA: Đây là một trình bao bọc hàm linh hoạt tốt đẹp cho đoạn mã trên. Bạn có thể chuyển bao nhiêu đoạn mã đường dẫn tùy thích, dưới dạng mảng hoặc các đối số riêng biệt:

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)


5
function pj ($ a, $ b) {return rtrim ($ a, '/'). '/'. ltrim ($ b, '/'); }
user89021

2
Điều này không phải lúc nào cũng hoạt động như mô tả. joinPaths ('', 'foo.jpg') trở thành '/foo.jpg'. Tôi nhận thấy điều này sau khi trình quản lý tệp php của tôi bắt đầu ghi tệp do người dùng mã hóa vào thư mục gốc của hệ thống tệp! Phiên bản đã sửa sẽ loại bỏ bất kỳ đường dẫn nào là chuỗi trống.
EricP

35
Điều này có nên sử dụng DIRECTORY_SEPARATOR thay vì '/' không?
Dave

2
@fe_ Đó là một chức năng hoàn toàn khác với những gì câu hỏi được đặt ra.
dối trá

3
Tôi không đồng ý vì người đó đã thông báo rõ ràng rằng anh ta đã sử dụng kết quả do python's os.path.joinđưa ra, kết quả này và kết quả mà anh ta thấy tuyệt vời. Vì vậy, tôi không tin rằng nó là một chức năng khác. Cũng như join('/a/b','../c')sẽ trở lại /a/cmà không cần bất kỳ chuẩn hóa bên ngoài nào.
fe_lix_

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

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

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

Giải pháp của tôi đơn giản hơn và giống với cách hoạt động của Python os.path.join

Hãy xem xét các trường hợp thử nghiệm này

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'

5
Đây là câu trả lời tốt nhất vì nó phù hợp nhất với câu hỏi - đây là câu trả lời gần nhất os.path.joinnối các chuỗi đường dẫn một cách thông minh . Câu trả lời có thể được cải thiện bằng cách thêm việc triển khai "tham chiếu" os.path.joinvà chỉ ra OP cụ thể phá vỡ quy tắc (trường hợp kiểm tra ['abc','/def']là sai wrt os.path.join, nhưng đúng theo câu hỏi).

@qix tại sao? Windows hiểu các dấu gạch chéo về phía trước là tốt
Riccardo Galli

4
@qix nhìn này, tôi hiểu quan điểm của bạn, thường thì tôi đồng ý với bạn, nhưng trên thực tế PHP sẽ không chạy trên các nền tảng không sử dụng dấu gạch chéo làm dấu phân cách đường dẫn bất cứ lúc nào và sử dụng hằng số preg_replace () sẽ trở thành một mớ hỗn độn thực sự (bạn cần phải thoát khỏi dấu phân cách đường dẫn trong regexp), vì vậy tôi chọn sự cân bằng này.
Riccardo Galli

4
Vì vậy, bạn đang cắt góc vì bạn lười biếng, mặc dù nội suy chuỗi của các hằng số trong PHP gần như miễn phí? Chậc chậc chậc.
Qix - MONICA ĐƯỢC HỖN HỢP

3
Như một lưu ý, nhóm của tôi vừa tìm thấy một trường hợp mà các /dấu phân tách không hoạt động (bản cài đặt PHP5.3.4 cũ trên Windows Server 2012 sử dụng msys git shell).
Félix Saparelli

17

Hàm của @ Deceze không giữ vị trí dẫn đầu / khi cố gắng tham gia một đường dẫn bắt đầu bằng một đường dẫn tuyệt đối Unix, ví dụ 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);
}

16

Lấy của tôi:

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

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

Tôi đã sử dụng một hàm ẩn danh cho trimds, nhưng các phiên bản PHP cũ hơn không hỗ trợ nó.

Thí dụ:

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

Đã cập nhật Tháng 4 năm 2013 Tháng 3 năm 2014 Tháng 5 năm 2018 :

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

Thao tác này sẽ sửa mọi dấu gạch chéo để phù hợp với hệ điều hành của bạn, không xóa dấu gạch chéo ở đầu và xóa nhiều dấu gạch chéo liên tiếp.


13
nó luôn luôn tạo ra một đường dẫn tuyệt đối, nhưng ít nhất ai đó đề cập DIRECTORY_SEPARATOR ...
Karoly Horvath

7

Nếu bạn biết tập tin / thư mục tồn tại , bạn có thể thêm dấu gạch chéo phụ (mà bạn có thể không cần thiết), sau đó gọi realpath , tức là

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

Tất nhiên, điều này không hoàn toàn giống với phiên bản Python, nhưng trong nhiều trường hợp có thể đủ tốt.


4

Một thay thế đang sử dụng implode()explode().

$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

Thử url /offset/0/limit/1.
Danon

3

Giải pháp bên dưới sử dụng logic do @RiccardoGalli đề xuất, nhưng được cải tiến để tận dụng DIRECTORY_SEPARATORhằng số, như @Qix và @ FélixSaparelli đã đề xuất, và quan trọng hơn, để cắt từng phần tử nhất định để tránh tên thư mục chỉ có khoảng xuất hiện trong phần cuối cùng đường dẫn (đó là một yêu cầu trong trường hợp của tôi).

Về việc thoát dấu phân tách thư mục bên trong preg_replace()mẫu, như bạn có thể thấy, tôi đã sử dụng preg_quote()chức năng này hoạt động tốt.
Hơn nữa, tôi sẽ chỉ thay thế các dấu phân tách nhỏ (bộ định lượng RegExp {2,}).

// PHP 7.+
function paths_join(string ...$parts): string {
    $parts = array_map('trim', $parts);
    $path = [];

    foreach ($parts as $part) {
        if ($part !== '') {
            $path[] = $part;
        }
    }

    $path = implode(DIRECTORY_SEPARATOR, $path);

    return preg_replace(
        '#' . preg_quote(DIRECTORY_SEPARATOR) . '{2,}#',
        DIRECTORY_SEPARATOR,
        $path
    );
}


2

Một cách khác để tấn công cái này:

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

1

Đây là phiên bản chỉnh sửa của chức năng được đăng bởi cheat. Nếu không có thay đổi này, joinPaths ('', 'foo.jpg') trở thành '/foo.jpg'

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;
}

1

Điều này dường như hoạt động khá tốt, và trông khá gọn gàng đối với tôi.

private function JoinPaths() {
  $slash = DIRECTORY_SEPARATOR;
  $sections = preg_split(
          "@[/\\\\]@",
          implode('/', func_get_args()),
          null,
          PREG_SPLIT_NO_EMPTY);
  return implode($slash, $sections);
}

1

Giải pháp tốt nhất được tìm thấy:

function joinPaths($leftHandSide, $rightHandSide) { 
    return rtrim($leftHandSide, '/') .'/'. ltrim($rightHandSide, '/'); 
}

LƯU Ý: Được sao chép từ nhận xét của người dùng89021


1

Phiên bản độc lập với hệ điều hành dựa trên câu trả lời của mpen nhưng được đóng gói thành một chức năng duy nhất và có tùy chọn thêm dấu phân tách đường dẫn.

function joinPathParts($parts, $trailingSeparator = false){
    return implode(
        DIRECTORY_SEPARATOR, 
        array_map(
            function($s){
                return rtrim($s,DIRECTORY_SEPARATOR);
            }, 
            $parts)
        )
        .($trailingSeparator ? DIRECTORY_SEPARATOR : '');
}

Hoặc cho bạn những người yêu thích một lớp lót:

function joinPathParts($parts, $trailingSeparator = false){
    return implode(DIRECTORY_SEPARATOR, array_map(function($s){return rtrim($s,DIRECTORY_SEPARATOR);}, $parts)).($trailingSeparator ? DIRECTORY_SEPARATOR : '');
}

Đơn giản chỉ cần gọi nó bằng một mảng các phần đường dẫn:

// No trailing separator - ex. C:\www\logs\myscript.txt
$logFile = joinPathParts([getcwd(), 'logs', 'myscript.txt']);

// Trailing separator - ex. C:\www\download\images\user1234\
$dir = joinPathParts([getcwd(), 'download', 'images', 'user1234'], true);

1

Cách tạo một lớp lót PHP thanh lịch lấy cảm hứng từ Python để tham gia đường dẫn.

Mã này không sử dụng mảng không cần thiết.

Đa nền tảng

function os_path_join(...$parts) {
  return preg_replace('#'.DIRECTORY_SEPARATOR.'+#', DIRECTORY_SEPARATOR, implode(DIRECTORY_SEPARATOR, array_filter($parts)));
}

Hệ thống dựa trên Unix

function os_path_join(...$parts) {
  return preg_replace('#/+#', '/', implode('/', array_filter($parts)));
}

Hệ thống dựa trên Unix không có tham số REST (không tôn trọng triết lý PEP8 rõ ràng):

function os_path_join() {
  return preg_replace('#/+#', '/', implode('/', array_filter(func_get_args())));
}

Sử dụng

$path = os_path_join("", "/", "mydir/", "/here/");

Phần thưởng: nếu bạn thực sự muốn theo dõi Python os.path.join (). Đối số đầu tiên là bắt buộc:

function os_path_join($path=null, ...$paths) {
  if (!is_null($path)) {
    throw new Exception("TypeError: join() missing 1 required positional argument: 'path'", 1);
  }
  $path = rtrim($path, DIRECTORY_SEPARATOR);
  foreach ($paths as $key => $current_path) {
    $paths[$key] = $paths[$key] = trim($current_path, DIRECTORY_SEPARATOR);
  }
  return implode(DIRECTORY_SEPARATOR, array_merge([$path], array_filter($paths)));
}

Kiểm tra nguồn os.path.join () nếu bạn muốn: https://github.com/python/cpython/blob/master/Lib/ntpath.py

Cảnh báo: Giải pháp này không phù hợp với url.


1

Là một dự án thú vị, tôi đã tạo ra một giải pháp khác. Nên dùng chung cho mọi hệ điều hành:

<?php

function join_paths(...$parts) {
    if (sizeof($parts) === 0) return '';
    $prefix = ($parts[0] === DIRECTORY_SEPARATOR) ? DIRECTORY_SEPARATOR : '';
    $processed = array_filter(array_map(function ($part) {
        return rtrim($part, DIRECTORY_SEPARATOR);
    }, $parts), function ($part) {
        return !empty($part);
    });
    return $prefix . implode(DIRECTORY_SEPARATOR, $processed);
}

// relative paths
var_dump(join_paths('hello/', 'world'));
var_dump(join_paths('hello', 'world'));
var_dump(join_paths('hello', '', 'world'));
var_dump(join_paths('', 'hello/world'));
echo "\n";

// absolute paths
var_dump(join_paths('/hello/', 'world'));
var_dump(join_paths('/hello', 'world'));
var_dump(join_paths('/hello/', '', 'world'));
var_dump(join_paths('/hello', '', 'world'));
var_dump(join_paths('', '/hello/world'));
var_dump(join_paths('/', 'hello/world'));

Các kết quả:

string(11) "hello/world"
string(11) "hello/world"
string(11) "hello/world"
string(11) "hello/world"

string(12) "/hello/world"
string(12) "/hello/world"
string(12) "/hello/world"
string(12) "/hello/world"
string(12) "/hello/world"
string(12) "/hello/world"

+1 Cảm ơn rất nhiều @Koala Yeung. Giải pháp của bạn tương thích với các phiên bản PHP trên v7.2. Mã từ câu trả lời được chấp nhận sử dụng create_ functions () không được dùng trong các phiên bản trên 7.2 - tuy nhiên, vào năm 2013, chúng tôi chỉ có PHP v5.5.
JackLeEmmerdeur

0

Đây là một hàm hoạt động giống như của Nodepath.resolve :

function resolve_path() {
    $working_dir = getcwd();
    foreach(func_get_args() as $p) {
        if($p === null || $p === '') continue;
        elseif($p[0] === '/') $working_dir = $p;
        else $working_dir .= "/$p";
    }
    $working_dir = preg_replace('~/{2,}~','/', $working_dir);
    if($working_dir === '/') return '/';
    $out = [];
    foreach(explode('/',rtrim($working_dir,'/')) as $p) {
        if($p === '.') continue;
        if($p === '..') array_pop($out);
        else $out[] = $p;
    }
    return implode('/',$out);
}

Các trường hợp kiểm tra:

resolve_path('/foo/bar','./baz')         # /foo/bar/baz
resolve_path('/foo/bar','/tmp/file/')    # /tmp/file
resolve_path('/foo/bar','/tmp','file')   # /tmp/file
resolve_path('/foo//bar/../baz')         # /foo/baz
resolve_path('/','foo')                  # /foo
resolve_path('/','foo','/')              # /
resolve_path('wwwroot', 'static_files/png/', '../gif/image.gif') 
                                  # __DIR__.'/wwwroot/static_files/gif/image.gif'

0

Từ câu trả lời tuyệt vời của Ricardo Galli, một chút cải tiến để tránh giết tiền tố giao thức.

Ý tưởng là kiểm tra sự hiện diện của một giao thức trong một đối số và duy trì nó trong kết quả. CẢNH BÁO: đây là một triển khai ngây thơ!

Ví dụ:

array("http://domain.de","/a","/b/")

kết quả đến (giữ giao thức)

"http://domain.de/a/b/"

thay vì (giao thức giết chết)

"http:/domain.de/a/b/"

Nhưng http://codepad.org/hzpWmpzk cần một kỹ năng viết mã tốt hơn.


0

Tôi thích câu trả lời của Riccardo và tôi nghĩ đó là câu trả lời hay nhất.

Tôi đang sử dụng nó để tham gia các đường dẫn trong xây dựng url , nhưng với một thay đổi nhỏ để xử lý dấu gạch chéo kép của giao thức:

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

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

    // Replace the slash with DIRECTORY_SEPARATOR
    $paths = preg_replace('#/+#', '/', join('/', $paths));
    return preg_replace('#:/#', '://', $paths);
}

0
function path_combine($paths) {
  for ($i = 0; $i < count($paths); ++$i) {
    $paths[$i] = trim($paths[$i]);
  }

  $dirty_paths = explode(DIRECTORY_SEPARATOR, join(DIRECTORY_SEPARATOR, $paths));
  for ($i = 0; $i < count($dirty_paths); ++$i) {
    $dirty_paths[$i] = trim($dirty_paths[$i]);
  }

  $unslashed_paths = array();

  for ($i = 0; $i < count($dirty_paths); ++$i) {
    $path = $dirty_paths[$i];
    if (strlen($path) == 0) continue;
    array_push($unslashed_paths, $path);
  }

  $first_not_empty_index = 0;
  while(strlen($paths[$first_not_empty_index]) == 0) {
    ++$first_not_empty_index;
  }
  $starts_with_slash = $paths[$first_not_empty_index][0] == DIRECTORY_SEPARATOR;

  return $starts_with_slash
    ? DIRECTORY_SEPARATOR . join(DIRECTORY_SEPARATOR, $unslashed_paths)
    : join(DIRECTORY_SEPARATOR, $unslashed_paths);
}

Ví dụ sử dụng:

$test = path_combine([' ', '/cosecheamo', 'pizze', '///// 4formaggi', 'GORGONZOLA']);
echo $test;

Sẽ xuất:

/cosecheamo/pizze/4formaggi/GORGONZOLA

0

Đây là giải pháp của tôi:

function joinPath(): string {

        $path = '';
        foreach (func_get_args() as $numArg => $arg) {

            $arg = trim($arg);

            $firstChar = substr($arg, 0, 1);
            $lastChar = substr($arg, -1);

            if ($numArg != 0 && $firstChar != '/') {
                $arg = '/'.$arg;
                }

            # Eliminamos el slash del final
            if ($lastChar == '/') {
                $arg = rtrim($arg, '/');
                }

            $path .= $arg;
            }

        return $path;
        }

0

Hmmm hầu hết có vẻ hơi phức tạp. Dunno, đây là công việc của tôi:

// Takes any amount of arguments, joins them, then replaces double slashes
function join_urls() {
   $parts = func_get_args();
   $url_part = implode("/", $parts);
   return preg_replace('/\/{1,}/', '/', $url_part);
}

0

Đối với những người muốn một hàm nối có dấu gạch chéo ngược của Windows và dấu gạch chéo ngược của Linux.

Sử dụng:

<?php
use App\Util\Paths
echo Paths::join('a','b'); //Prints 'a/b' on *nix, or 'a\\b' on Windows

Tệp lớp:

<?php
namespace App\Util;

class Paths
{
  public static function join_with_separator($separator, $paths) {
    $slash_delimited_path = preg_replace('#\\\\#','/', join('/', $paths));
    $duplicates_cleaned_path = preg_replace('#/+#', $separator, $slash_delimited_path);
    return $duplicates_cleaned_path;
  }

  public static function join() {
    $paths = array();

    foreach (func_get_args() as $arg) {
      if ($arg !== '') { $paths[] = $arg; }
    }
    return Paths::join_with_separator(DIRECTORY_SEPARATOR, $paths);
  }
}

Đây là chức năng kiểm tra:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;
use App\Util\Paths;

class PathsTest extends TestCase
{
  public function testWindowsPaths()
  {
    $TEST_INPUTS = [
      [],
      ['a'],
      ['a','b'],
      ['C:\\','blah.txt'],
      ['C:\\subdir','blah.txt'],
      ['C:\\subdir\\','blah.txt'],
      ['C:\\subdir','nested','1/2','blah.txt'],
    ];
    $EXPECTED_OUTPUTS = [
      '',
      'a',
      'a\\b',
      'C:\\blah.txt',
      'C:\\subdir\\blah.txt',
      'C:\\subdir\\blah.txt',
      'C:\\subdir\\nested\\1\\2\\blah.txt',
    ];
    for ($i = 0; $i < count($TEST_INPUTS); $i++) {
      $actualPath = Paths::join_with_separator('\\', $TEST_INPUTS[$i]);
      $expectedPath = $EXPECTED_OUTPUTS[$i];
      $this->assertEquals($expectedPath, $actualPath);
    }
  }
  public function testNixPaths()
  {
    $TEST_INPUTS = [
      [],
      ['a'],
      ['a','b'],
      ['/home','blah.txt'],
      ['/home/username','blah.txt'],
      ['/home/username/','blah.txt'],
      ['/home/subdir','nested','1\\2','blah.txt'],
    ];
    $EXPECTED_OUTPUTS = [
      '',
      'a',
      'a/b',
      '/home/blah.txt',
      '/home/username/blah.txt',
      '/home/username/blah.txt',
      '/home/subdir/nested/1/2/blah.txt',
    ];
    for ($i = 0; $i < count($TEST_INPUTS); $i++) {
      $actualPath = Paths::join_with_separator('/', $TEST_INPUTS[$i]);
      $expectedPath = $EXPECTED_OUTPUTS[$i];
      $this->assertEquals($expectedPath, $actualPath);
    }
  }
}

-7

Tôi thích một số giải pháp được trình bày. Nhưng những người thay thế tất cả '/ +' thành '/' (biểu thức chính quy) đang quên rằng os.path.join () từ python có thể xử lý loại liên kết này:

os.path.join('http://example.com/parent/path', 'subdir/file.html')

Kết quả: ' http://example.com/parent/path/subdir/file.html '


1
Câu hỏi được hỏi cho PHP, câu trả lời là dành cho Python
Toilal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.