2005/06/12

另外一個用了一點正規式寫出來的路徑修正函數

這個做法跟之前的比較,再於對要處理的字串先做一些處理,以減少之後在迴圈中判斷的複雜度。

function &路徑修正($路徑, $編碼 = false, $調整 = false) {
    $陣列 = explode('://', strtr($路徑, '\\', '/'), 2);
    //    取代 '/./', '/ /', '//' 這三類字串成為 '/'
    $比對 = '/\/((([\s]+)|([\s]*\.[\s]*))?\/)+/';
    $取代 = '/';
   
    if (2 == count($陣列)) {
        $前綴 = $陣列[0] . '://';
        $陣列 = explode('/', preg_replace($比對, $取代, $陣列[1]));
    } else {
        $前綴 = '';
        $陣列 = explode('/', preg_replace($比對, $取代, $陣列[0]));
    }
   
    $路徑 = array();
    foreach ($陣列 as $變數) {
        $測試 = trim($變數);
        if ('..' == $測試) {
            $測試 = end($路徑);
            if ('' == $測試 || '..' == $測試) {
                $路徑[] = '..';
            } else {
                array_pop($路徑);
            }
        } else if (false == $編碼) {
            $路徑[] = $變數;
        } else {
            $路徑[] = urlencode($變數);
        }
    }
   
    $路徑 = implode('/', $路徑);
    if ('' != $前綴) {
        $路徑 = $前綴 . $路徑;
    } else if ($調整 && (PHP_OS == 'WIN32' || PHP_OS == 'WINNT')){
        $路徑 = strtr($路徑, '/', '\\');
    }
    return $路徑;
}

2005/06/04

路徑修正函數

realpath有很多情況不能處哩,所以自己寫了一個路徑修正的程式去配合...
修正一個小錯誤...

function 路徑修正($路徑, $編碼 = false, $調整 = false) {
    $陣列 =    explode('://', strtr($路徑, '\\', '/'), 2);
    if (2 == count($陣列)) {
        $前綴 = $陣列[0];
        $陣列 = explode('/', $陣列[1]);
    } else {
        $前綴 = '';
        $陣列 = explode('/', $陣列[0]);
    }
   
    $路徑 = array();
    foreach ($陣列 as $變數) {
        $測試 = trim($變數);
        if ('..' == $測試) {
            if (0 == count($路徑) || '..' == end($路徑) || (1 == count($路徑) && '' == end($路徑))) {
                $路徑[] = '..';
            } else {
                while(1 < count($路徑) && '' == end($路徑)) {
                    array_pop($路徑);
                }
                array_pop($路徑);
            }
        } else if ('.' == $測試 || '' == $測試) {
            continue;
        } else {
            if (false == $編碼) {
                $路徑[] = $變數;
            } else {
                $路徑[] = urlencode($變數);
            }
        }
    }
    $路徑 = implode('/', $路徑);
    if ('' != $前綴) {
        $路徑 = "$前綴://$路徑";
    }
    if ((PHP_OS == 'WIN32' || PHP_OS == 'WINNT') && '' == $前綴 && true == $調整) {
        $路徑 = strtr($路徑, '/', '\\');
    }
    return $路徑;
}