close
這個做法跟之前的比較,再於對要處理的字串先做一些處理,以減少之後在迴圈中判斷的複雜度。
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 $路徑;
}
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 $路徑;
}
全站熱搜
留言列表