2011-08-09 40 views
0

我剛剛完成學習正則表達式,我想我應該把它變成有用的東西,所以我創建了PHP的小URL路由腳本和下面的正則表達式:困惑正則表達式中的URL路由腳本行爲

^(?:/(\w+)?)*$ 

(php代碼目前不做任何事情,只是打印出preg_match中的匹配組) 當前如果給定url /foobar/foo/bar,匹配組是整個字符串(正常行爲)和url的最後部分這種情況下:bar)。
顯然,這是一個問題。

我認爲這是由於使用1個捕獲組而導致的,它只捕獲最後一個匹配的字符串,但我不確定。任何意見,真正的原因和/或解決方案,將不勝感激。

在此先感謝!

+0

再來,究竟是什麼問題呢?你想要捕捉什麼?你的正則表達式看起來相當危險,嵌套的「是,但是,不,但」重複操作符(它是Vicky Pollard正則表達式!),但沒有關於你想匹配什麼的更多信息,也不清楚如何改進它。 – tripleee

+0

@tripleee我希望每個組都會被記住,並且不會在每場比賽中被覆蓋(但根據Tim的回答,這是不可能的)。正則表達式非常「危險」,因爲我希望能夠在沒有對代碼進行任何檢查的情況下向他拋出一個URL,所以我讓正則表達式執行代碼將做的事情(剝離斜線,匹配空路徑等)。 )。 – GZaidman

回答

1

您已經正確診斷問題 - 在周圍羣組的每次重複中,捕獲組的先前匹配的內容都被新匹配「覆蓋」。

目前尚不十分清楚你會發生什麼。我想你會希望將這條道路的每一部分都作爲自己的羣體「記住」?這是你不能用PHP中的重複組做的事情(只有少數正則表達式(Perl 6和.NET)允許這樣的事情)。

在你的情況,你可能使用您正則表達式驗證URL更好,然後沿斜線分割它:

$result = preg_split('%/%', $subject); 
+0

是的,那正是我認爲會發生的事情(也許是時候切換回perl?:P)。關於你的建議,從性能的角度來看,使用'explode'而不是'preg_split'會更好嗎? – GZaidman

+0

我很確定它會是(因爲你正在分裂一個固定的字符)。 –

+0

事實證明有一種方法可以在php中實現 - 我修改了正則表達式,因此它不包含'*',並使用了'preg_match_all',它給了我所有的部分。 – GZaidman