2011-04-12 14 views
7

Temel endişelerim, temel olarak, dizin ayırıcıları için arka ve ileri eğik çizgileriyle ilgili olarak, OS'lerdeki yolları işleyebilmektir.PHP: OS'lerde yolları evrensel hale getirmenin iyi bir yolu (eğik yönler)

  1. O

  2. Yollar farklı kaynaklardan gelebilir ille ben

sizin tarafından kontrol edilmeyen yazmak için uzun açıklanmıştır: Ben ancak, DIRECTORY_SEPARATOR kullanıyordum

Şu anda kullanarak m:

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

zaten bunu yapmak için bir dahili PHP functon var mı, ben yeniden icat ediyorum dilde mevcut bir şey olmadığını bilmek istiyorum?

+0

orada olmasını sağlayacaktır. Bu size yardımcı olacaktır, çünkü 'runningOnWindows' kontrol etmenize gerek yoktur. Sadece sizin işlevinizi yapmak için her tür eğik çizgi dönüştürmeniz gerekir * DIRECTORY_SEPARATOR' –

cevap

25

,

Ancak: 1. Bu

Tembellik şey için bir sebep asla yazmak için uzundur

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

veya

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

Bu, bir adımda "doğru olanı" kendisiyle değiştirecek, ancak bu hiçbir fark yaratmıyor. Eğer kesin biliyorsanız, bir yol varolduğunu, kullanabileceğiniz

realpath()

$path = realpath($path); 

her işletim sistemi bile (geçerli bir dizin ayırıcı olarak eğik çizgi / anlar çünkü Ancak, bu, hiç de gerekli değildir pencereler).

+0

Cehennem, hatta Windows üzerinde eğik çizgi karıştırabilirsiniz. ' 'C: \ Foo \ Bar/baz/neyi.php 'PHP'de tamamen yasal bir yoldur. – Charles

+0

Hehe, evet, bunun hakkında düşünmek için hiçbir sebep yok. Bildiğim kadarıyla tam olarak bir istisna var, nerede kazanmak http://php.net/domdocument.load üzerinde bir fark yaratır. Ayrıca çözümden bahsedilir;) – KingCrunch

+0

"Hatta Windows üzerinde eğik çizgi karıştırabilirsiniz". Bu, Windows üzerinde çalışmadığı bir örnek: exec ("rd path \ with/mixed/slashes")/ – shealtiel

3

DIRECTORY_SEPARATOR önceden tanımlı sabitini kaçırıyorsunuz. Ben DIRECTORY_SEPARATOR farkındayım

+1

içinde tanımlanmış * hariç, o yapmak istediği için yeterli değil (mevcut işletim sistemi biçimine * herhangi bir * yolu dönüştürmek için genel bir yöntem oluşturun). Ama bu bir başlangıç ​​ –

+0

@ Pekka: Elbette. Ancak, IMHO'nun bu koddaki en hoş olmayan şey olduğu özel işletim sistemi algılamasını kaybedebilir. – Jon

1

Bu yolları standart PHP işlevlerine iletecekseniz, söyleyebileceğim kadarıyla yolları düzeltmeniz gerekmez. file_get_contents veya fopen gibi temel işlevler, attığınız herhangi bir yolla mükemmel şekilde çalışır.

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

bu bir zamanda mevcut OS'nin ayırıcısını tutan `DIRECTORY_SEPARATOR` sabit Orada bir eğik çizgi

İlgili konular