2011-04-12 22 views
7

Mối quan tâm đơn giản của tôi là có thể xử lý các đường dẫn trên hệ điều hành, chủ yếu liên quan đến các dấu gạch chéo ngược và tiến.PHP: cách tốt để phổ cập đường dẫn trên các hệ điều hành (hướng cắt giảm)

Tôi đã sử dụng DIRECTORY_SEPARATOR, tuy nhiên:

  1. Đó là thời gian để viết

  2. Paths có thể đến từ nhiều nguồn khác nhau, không nhất thiết phải kiểm soát bởi bạn

tôi hiện đang sử dụng:

function pth($path) 
    { 
     $runningOnWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); 
     $slash = $runningOnWindows ? '\\' : '/'; 
     $wrongSlash = $runningOnWindows ? '/' : '\\' ; 
     return (str_replace($wrongSlash, $slash, $path)); 
    } 

Chỉ muốn biết rằng không có gì tồn tại bằng ngôn ngữ mà tôi đang tái phát minh là,

Có đã là một PHP functon sẵn có để làm điều này?

+0

Có là 'liên tục DIRECTORY_SEPARATOR' chứa tách hệ điều hành hiện tại của. Nó sẽ giúp bạn bởi vì bạn không cần phải kiểm tra 'runningOnWindows'. Bạn chỉ cần làm cho hàm của bạn chuyển đổi tất cả các loại dấu gạch chéo * ngoại trừ * một định nghĩa trong 'DIRECTORY_SEPARATOR' –

Trả lời

25

Tôi nhận thức được DIRECTORY_SEPARATOR,

Tuy nhiên: 1. Đó là thời gian để viết

Sự lười biếng không bao giờ là một lý do cho bất cứ điều gì

$path = (DIRECTORY_SEPARATOR === '\\') 
     ? str_replace('/', '\\', $subject) 
     : str_replace('\\', '/', $subject); 

hoặc

$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); 

Điều này sẽ trong một bước thay thế "đúng" với chính nó, nhưng điều đó không tạo ra bất kỳ sự khác biệt nào.

Nếu bạn biết chắc chắn, đó là một con đường tồn tại, bạn có thể sử dụng realpath()

$path = realpath($path); 

Tuy nhiên, đó là không cần thiết ở tất cả, vì mỗi hệ điều hành hiểu dấu gạch chéo / như một tách thư mục hợp lệ (thậm chí các cửa sổ).

+0

Địa ngục, thậm chí bạn có thể trộn các dấu gạch chéo trên Windows. ''C: \ Foo \ Bar/baz/cái gì.php'' hoàn toàn là một con đường hợp pháp trong PHP. – Charles

+0

Hehe, vâng, không có lý do gì để nghĩ về điều đó. Theo như tôi biết có chính xác một ngoại lệ, nơi nó làm cho một sự khác biệt trên win http://php.net/domdocument.load Ngoài ra giải pháp được đề cập ở đó;) – KingCrunch

+0

"bạn thậm chí có thể trộn slashes trên Windows". Đây là một ví dụ khi điều này không làm việc trên windows: exec ("rd path \ with/mixed/slashes") coi/như là một khóa cho lệnh – shealtiel

3

Bạn đang thiếu hằng số được xác định trước DIRECTORY_SEPARATOR.

+1

Vâng, nó không đủ cho những gì anh ta muốn làm (Xây dựng một phương pháp chung để chuyển đổi * bất kỳ đường dẫn * sang định dạng của hệ điều hành hiện tại). Nhưng đó là một sự khởi đầu –

+0

@Pekka: Chắc chắn rồi. Nhưng anh ta có thể mất phát hiện hệ điều hành tùy chỉnh, IMHO là điều khó chịu nhất trong mã đó. – Jon

1

Nếu bạn định chuyển các đường dẫn đó đến các hàm PHP chuẩn, bạn thực sự không cần sửa đường dẫn, theo như tôi có thể nói. Các chức năng cơ bản như file_get_contents hoặc fopen hoạt động hoàn toàn tốt với bất kỳ loại đường dẫn nào bạn ném vào chúng.

0
static function fx_slsh($path) { 
    $path = str_replace(['/','\\'], DIRECTORY_SEPARATOR, $path); 
    return substr($path, -1) == DIRECTORY_SEPARATOR ? $path : $path . DIRECTORY_SEPARATOR; 
    } 

này cũng sẽ đảm bảo có một dấu slash

Các vấn đề liên quan