2012-01-13 72 views
1

有沒有在PHP的方式做的preg_match上一個網址,如下所示的preg_match動態URL

動態/動態的/ dev/new_mobile/lib目錄

,它只會拉出來dev/new_mobile和鏈接也必須這樣太

動態/動態/動態/ TST/new_mobile/lib目錄

的能力

在上面的例子中,它只會拉出tst/new_mobile。關鍵是它會在lib之前抓取最後兩個目錄。任何想法如何做到這一點?

+0

你試過了什麼?讓我們知道,如果你有問題http://php.net/manual/en/function.preg-match.php – rdlowrey 2012-01-13 18:34:01

+0

以及事情是開發和new_mobile也可以改變,我忘了提及可能有更多的目錄在lib之後。唯一不變的是在lib之前有兩個我需要抓取的目錄 – Alex 2012-01-13 18:49:49

+1

您是否嘗試過使用'preg_match'?因爲它幾乎可以處理任何你可以扔在它上面的東西。或者是你的問題*「請爲我寫我的正則表達式,因爲我不知道如何」*? – rdlowrey 2012-01-13 19:06:30

回答

2

這裏有一個正則表達式,將讓你想要的部分:

$url = 'dynamic/tst/new_mobile/lib/foo/bar'; 

if (preg_match('#^(?:.*?/)?([^/]+/[^/]+)/lib(?:/.+)?$#', $url, $matches)) { 
    $part = $matches[1]; 
    var_dump($part); // "tst/new_mobile" 
} 

這將得到lib目錄前的2個目錄允許前後任何目錄。它也將匹配幾個邊緣情況,你不提你是否需要:

tst/new_mobile/lib/foo/bar 
/tst/new_mobile/lib/foo/bar 
2

只是爆炸然後倒陣,簡單易用。

$array_url = explode('/',$url); 

$tmp_array_url = array_reverse($array_url); 

那麼你可以重建,因爲你會,不需要懷疑有多少動態部分來之前。

echo $tmp_array_url[0]; // "lib"; 
echo $tmp_array_url[1]; // "new_mobile"; 
echo $tmp_array_url[2]; // "dev"; 

編輯:既然你有LIB不變,只是做這樣的事情:

$the_two_before = ""; 
for($i = 0; $i < count($tmp_array_url); $i++){ 
    if($tmp_array_url[$i] == "lib"){ 
     $the_two_before = $tmp_array_url[$i+2]."/".$tmp_array_url[$i+1]; 
    } 
} 
+0

以及事情是開發和new_mobile也可以改變,我忘了提及可能有更多的目錄後lib。唯一不變的是在lib之前有兩個目錄,我需要抓住 – Alex 2012-01-13 18:50:00

+0

想要更準確地知道爲什麼你需要這個目錄?可能有一個選項通過$ _SERVER變量,但我不知道是否撥出。 – 2012-01-13 18:52:53

+0

我需要它,因爲我將這兩個變量保存在$ _SESSION中,並且稍後必須在應用程序中使用它來查找正確的文件。 – Alex 2012-01-13 18:56:46