2014-05-24 82 views
0

我正在嘗試爲PHP編寫一個簡單的路由器。而我正面臨一些問題。路線的例子如下。正則表達式解決方案來查找正則表達式模式並解析它。

$route = [] 
$route['index']  = "/"; 
$route['home']  = "/home"; 
$route['blog']  = "/blog/[a-z]"; 
$route['article'] = "/article/id/[\d+]/title/[\w+]"; 

現在,如果我們把最後一個例子,我想正則表達式只尋找模式,如[\d+][\w+],就是這樣。我將使用explode()實際交叉檢查URL是否包含/blog/,/id//title/。我不希望正則表達式的幫助,但只是爲了檢測模式並匹配它。例如

。如果給定$URLdev.test/blog/id/11/title/politics

我需要一些像:preg_match($route['url'], $URL)

所以,現在preg_match()功能都知道,"/article/id/後有要求僅出現一個數字的模式,那麼如果數字被發現它將繼續解析,否則它將顯示失敗或0

我不太瞭解正則表達式來處理這個複雜的問題。

+0

如果你有一個正則表達式煩惱的位置,也許你可以使用一些已經會爲你喜歡Laravel?或者使用[本視頻](https://www.youtube.com/watch?v=6reEBParHzQ)或[本文](http://www.kratedesign.com/blog/2010/03)中所述的路由解決方案/ php-router-and-clean-urls /) – Laoujin

+0

@Lououjin你說得對。我甚至可以使用FastRoute。但問題是,對於小規模項目來說,這些替代品是過度殺傷性的。 –

+0

有關正則表達式模式的正則表達式模式,展開爲正則表達式模式! – JakeGould

回答

1

您的問題有點不清楚,但是如果您只想捕獲目標字符串的[\ d +]或[\ w +]部分,則應考慮使用括號來捕獲子匹配,​​並且(? XXX)非獲取匹配,該檢查的模式,但不將其添加到陣列,是這樣的:

$route['article'] = "(?:\/article\/id\/)([\d+])(?:\/title\/)([\w+])"; 

這將添加匹配[\ d +]和[\ w +]你比賽陣只。你會發現他們像這樣:

$matches[0][0] and matches[1][0]. 

對正則表達式的優秀教程參見http://www.regular-expressions.info/tutorial.html,順便說一句。

如果您事先不確定'article','id'和'title'的值,那麼您可能至少需要確定url中給出的目錄數量。這意味着,只要你知道的[\ d +]和[\ w +]條目,你可以使用

$route['article'] = "(?:\/[\w+]\/[w+]\/)([\d+])(?:\/[\w+]\/)([\w+])" 
+0

感謝您的回覆。你的答案唯一的問題是,我還必須檢查''/ article/id /'和'/ title /'我不想用正則表達式來檢查它們,我可以用其他方式來做。是正則表達式來查找模式,即'[]'內的任何內容,並驗證它是否爲真,希望這更清楚 –

+0

不是真的 - 但如果你的意思是'文章','id'和'標題'是動態的,並且可以改變,那麼你至少需要確定url中給出的目錄數量,這意味着只要你知道[\ d +]和[\ w +]的位置,您可以使用「(?:\/[\ w +] \/[w +] \ /)([\ d +])(?:\/[\ w +] \ /)([\ w +])」 – Hektor

+0

猜這是不可能的解釋或做,但感謝努力無論如何 –