2011-05-26 80 views
1

我目前使用下面的代碼來實現網址中的頁面,節和類變量。使用php將URL分割爲頁面和文件夾變量?

$domain = 'http://' . $_SERVER['HTTP_HOST']; 
$path = $_SERVER['REQUEST_URI']; 
$url = $domain . $path; 

// page + section + class 
$page = basename($url); 
$page = $class = str_replace('.php','',$page); 
$page = str_replace('-',' ',$page); 

if ($path == "/") { 
    $section = $class = "home"; 
} else if (basename(dirname($url),"/") == $_SERVER['HTTP_HOST']) { 
    $section = $page; 
} else { 
    $section = basename(dirname($url),"/"); 
    $section = str_replace('-',' ',$section); 
    $class = basename(dirname($url),"/") . " " . $class; 
} 

例如,如果URL是http://www.mydomain.co.uk/about/代碼將返回以下變量:

$page = "about" 
$section = "about" 
$class = "about" 

對於http://www.mydomain.co.uk/about/general-info/

$page = "general info" 
$section = "about" 
$class = "about general-info" 

但是當我添加更多的深度例如爲http://www.mydomain.co.uk/about/general-info/history/代碼生產:

$page = "history" 
$section = "general info" 
$class = "general-info history" 

理想的地方我需要它輸出如下:

$page = "history" 
$section = "about general info" 
$class = "about general-info history" 

或擊穿節放到儘可能多的需要,例如:

$section1 = "about" 
$section2 = "general-info" 

希望有人可以提供幫助。如果有什麼不清楚的地方,請詢問。

+0

請問可以告訴我,直到網址會有多少層次?像這裏你已經提供了直到第三級。 – 2011-05-26 13:37:11

+0

在大多數情況下,它只會持續到第3天。它可能會去第四次,但目前第三 – 2011-05-26 13:39:09

+0

檢查費迪南德的第一個答案。它也是我喜歡的。 – 2011-05-26 13:41:10

回答

2

所以,你想要一個URI的方案如下?

http://<domain>/<section-1>/<section-2>/.../<page>/ 

特殊情況:

(1) http://<domain>/   -- page is empty, section is "home" 
(2) http://<domain>/<section>/ -- page and section are '<section>' 

不是依靠basename(),你應該將字符串分割成使用explode()preg_split()數組。您可以直接使用REQUEST_URI,因爲域名不會爲您的部分和頁面提供任何額外信息。

一旦你有一個數組,你可以很容易地得到count()路徑組件的數量,處理空和一號路徑的特殊情況,等等。在下面的示例中,我使用array_pop()來提取路徑的最後部分,以將頁面與部分分開。由於您似乎希望分區和頁面使用空格分隔的字符串,因此我使用implode()將數組連接回字符串。

// No need for the domain stuff! 
$path = $_SERVER['REQUEST_URI']; 

// Split at '/', could use explode() but the PREG_SPLIT_NO_EMPTY flag is 
// very handy since it handles "//" and "/" at start/end. 
$tokens = preg_split('#/#', $path, -1, PREG_SPLIT_NO_EMPTY); 

if (count($tokens) == 0) { 
    // Special case 1 
    $page = ""; 
    $section = $class = 'home'; 
} elseif (count($tokens) == 1) { 
    // Specical case 2 
    $page = $section = $class = $tokens[0]; 
} else { 
    // Class contains all tokens. 
    $class = implode(' ', $tokens); 

    // The last part is the page. 
    $page = array_pop($tokens); 

    // Everything else are sections. 
    $sections = implode(' ', $tokens); 
} 

// You seem to want spaces for dashes in the section: 
$section = str_replace('-', ' ', $section); 
+0

我會給代碼一個現在去。先謝謝你! – 2011-05-26 13:52:33

+0

很好,非常感謝。通過在$ page和$部分進行測試,可以靈活地顯示和隱藏整個站點中的某些元素。這是一個基於php的網站,使用perch作爲cms,因此不會控制頁面。 $ class只是將一個簡單的類添加到body標籤中,僅僅是將頁面需要的樣式略微不同。 要測試頁面或節中,我一直在使用下列內容: '' 它的工作原理,但這種正確或最好的方式去? – 2011-05-26 15:04:11

+0

要測試某個節,您應該跳過'implode()'部分,將節列表保存爲一個數組,並使用'in_array(「general-information」,$ sections)'來代替。請參閱:http://www.php.net/in_array – 2011-05-26 15:55:24

4

如何使用更一般的分裂?

// Url: http://www.mydomain.co.uk/about/general-info/history/ 
$slices = explode('/', $_SERVER['REQUEST_URI']); 
// $slices == ['about', 'general-info', 'history'] 

然後做你的路由,只要你想:

$class = implode(' ', $slices); 
$section = $slices[1]; 
// etc. 
+0

簡單是更好的伊莫。 – torinagrippa 2015-06-09 15:38:25