2012-02-18 110 views
1

我想匹配具有可選分段的網址格式。正則表達式,按特定順序匹配網址片段?

我有網址,就像這樣:

subdomain.domain.com/page/pageurl/pagename/123/ 
subdomain.domain.com/page/pageurl/pagename/ 
subdomain.domain.com/page/pageurl/ 
subdomain.domain.com/page/ 

現在我有所有這些情況相匹配的正則表達式:

^([a-z]+)\.domain\.com\/page(\/[a-z]+)?(\/[a-z]+)?(\/[0-9]+)?\/?$ 

但是如果你去這個網址這個regexs失敗:

subdomain.domain.com/page/123/ 

它也匹配這個網址,我不希望發生這種情況,因爲第一段應該是[az] +而沒有任何東西倫敦政治經濟學院。現在我明白爲什麼會發生這種情況,但我無法弄清楚正確的正則表達式來滿足我的需求。 我需要一個匹配這些URL-s的正則表達式,但爲了順序,所以如果第一個段後面的數字,它不應該匹配...

我該怎麼做?我要去瘋狂現在:S

Rubural例如:LINK

謝謝!

+0

是THI s在mod_rewrite中? – Umbrella 2012-02-18 18:21:35

+0

不,這是在PHP中,我使用preg_match()來匹配URL-s。 – Limeni 2012-02-18 18:24:28

+0

只是刪除第一個'段',(\/[a-z] +)的捕獲組後面的問號?成爲(\/[a-z] +) – Robjong 2012-02-18 18:27:35

回答

3

我們可以讓第一「段」的捕獲組強制性的,所有段可選,像這樣: ^([a-z]+)\.domain\.com\/page(?:(\/[a-z]+)(\/[a-z]+)?(\/[0-9]+)?)?\/?$

可能有用的另一件事是允許任何有效的子域,圖案看起來像這樣的:

^([\w.-]+)+\.domain\.com\/page(?:(\/[a-z]+)(\/[a-z]+)?(\/[0-9]+)?)?\/?$

編輯:固定的模式,如雨傘指出(謝謝)我prevous模式將不能滿足您的最後一個例子字符串,哎呀

4

我想你需要的是一個向後看

^([a-z]+)\.domain\.com\/page(\/[a-z]+)?(\/[a-z]+)?((?<!\/page)\/[0-9]+)?\/?$ 

什麼(?<!\/page)應該做的是斷言「/頁」不會立即前面的數字。

編輯

我測試它像這樣:

$re = '/^([a-z]+)\.domain\.com\/page(\/[a-z]+)?(\/[a-z]+)?((?<!\/page)\/[0-9]+)?\/?$/'; 
foreach(array(
     'subdomain.domain.com/page/pageurl/pagename/123/', 
     'subdomain.domain.com/page/pageurl/pagename/', 
     'subdomain.domain.com/page/pageurl/', 
     'subdomain.domain.com/page/', 
     'subdomain.domain.com/page/123/', 
     ) as $url 
) { 
    $matches = array(); 
    preg_match($re,$url,$matches); 
    var_dump($matches); 
} 

,並獲得比賽的第4位,而不是最後一次。

+0

感謝傘,但我並不需要後視。你的例子工作,但對於「我」解決其他答案的問題更適合我。 無論如何非常感謝! :)你幫助我學習一些新的技巧與正則表達式:) – Limeni 2012-02-19 21:36:15