2013-08-06 28 views
4

我得到這個模式(我使用PHP):PHP,正則表達式

'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?)\]/i' 

當我搜索這個字符串:http://phpquest.zapto.org/users/register.php

這些比賽(順序爲0-5):

  1. '[link=http://phpquest.zapto.org/users/register.php]'
  2. 'http://phpquest.zapto.org/users/register.php'
  3. 'http://'
  4. 'phpquest.zapto'
  5. org
  6. ''

當我+取代*最後子模式一樣,內部:

'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]+)*\/?)\]/i' 

的匹配是(順序是0-5 ):

  1. '[link=http://phpquest.zapto.org/users/register.php]'
  2. 'http://phpquest.zapto.org/users/register.php'
  3. 'http://'
  4. 'phpquest.zapto'
  5. org
  6. '/users/register.php'

如果有人能幫助我理解這是爲什麼我會很感激,謝謝大家,並有美好的一天。

+0

'爲什麼是' - 嘗試指定你的問題。 – MightyPork

+4

你爲什麼不使用'parse_url'?不要重新發明輪子,我們知道他們是如何工作的。 – Halcyon

+0

我可以使用它我看了一看,但我想明白原因,謝謝 –

回答

3

也許一個更簡單的例子是當你比較thisthis

涉及的正則表達式是:

(a*)* 

(a+)* 

而且測試字符串是aaaaaa

發生什麼事情是,在捕獲主要組(在我提供的例子中,系列a's)後,它嘗試匹配更多但不能。可是等等!它也可以不匹配,因爲*意味着0或更多次!

因此,在匹配所有的a之後,它會匹配並捕獲一個「無」,並且因爲只有最後一個捕獲的部分被存儲,所以得到「'作爲捕獲組的結果。

(a+)*,匹配和捕捉aaaaaa後,它不能匹配或捕捉到任何更多(+防止它來搭配什麼,而不是*),因此,aaaaaa是最後一場比賽。

+0

傑裏非常感謝,現在我明白了,很好地解釋了答案,再次感謝,祝你有美好的一天。 –

+0

@uBlankText不客氣:) – Jerry

2

這可以簡化爲以下模式。

/\[link=(https?:\/\/)(([a-z0-9]+\.?)+)((\/[^\/]+)+)\/?\]/i 

正則表達式符號*不貪心,而+是。因此,在第二次嘗試中使用+時,所有路徑組件都會匹配,並且該組被捕獲;但是,在*的第一次嘗試中,由於您僅使用圓括號捕獲了內部*組,因此您匹配*的非貪婪樣本,在此情況下不包含任何內容。

+0

謝謝你馬特,但你能解釋爲什麼我的問題上的模式沒有顯示*上的最後一個子模式和+它的doe's。 –

+0

這不是問題的答案,是嗎?作者問:「爲什麼它的行爲如此?」不是「如何讓它變得更好」 – mondjunge