2013-01-05 224 views
0

我似乎無法得到的正則表達式時,我需要使用他們...PHP的preg_match正則表達式的字符串捕獲模式

鑑於這樣一個字符串:

$string = 'text here [download="PDC" type="A"] and the text continues [download="PDS" type="B"] and more text yet again, more shotcodes might exist ...'; 

我需要打印「text here」部分,然後根據變量「PDC」和「A」執行mysql查詢,然後打印剩餘的字符串...(如果字符串中存在更多[下載],則再次重複) 。

到目前爲止,我有以下的正則表達式

$regex = '/(.*?)[download="(.*?)" type="(.*?)"](.*?)/'; 
preg_match($regex,$string,$res); 
print_r($res); 

但這只是捕捉了以下內容:

Array ([0] => 111111 [1] => 111111 [2] =>) 

我使用的preg_match()...我應該使用preg_match_all()代替?無論如何...正則表達式肯定是錯誤的...任何幫助?

+1

'['打開字符類和']'完成它。這些具有含義的字符需要在PCRE正則表達式中轉義或放入QE塊中。 – hakre

+0

對不起。我沒跟着你... –

+0

什麼是「tipo」? –

回答

2

[打開字符類,]完成它。這些具有含義的字符需要在PCRE正則表達式中轉義或放入QE塊中。

/(.*?)\Q[download="\E(.*?)" type="(.*?)"](.*?)/ 
     ##^   ##   ^-- you were looking for "tipo" 
     | 
    this character needs to be taken literal, hence the \Q....\E around it 
                 ## ## 
+0

現在好多了,謝謝@hakre!但仍然不完整。我得到:Array([0] => text here [download =「PDC」type =「A」] [1] => text here [2] => PDC [3] => A [4] => )... [0]部分應該只是「文本在這裏」,[4]應該有其餘的字符串... –

+0

那麼,你只需要重新琢磨。之後會更好,因爲[0]總是完全匹配。如果你需要用正則表達式來改變它,這可能會變得多餘(並且通常不這樣做)。只需將返回數組處理爲一個新數組,並使用具有所需索引的新數組。 – hakre

+0

有點擰在這裏:|最後一個(。*?)組沒有拿起任何東西......在print_r($ result)中,最後一個位置總是空的,我不知道爲什麼。你可以在這裏afonsogomes.com/teste.php高峯嗎?請請請! –

1

與嘗試它 「小」 一

/(?P<before>(?:(?!\[download="[^"]*" type="[^"]*"\]).)*)\[download="(?P<download>[^"]*)" type="(?P<type>[^"]*)"\](?P<after>(?:(?!\[download="[^"]*" type="[^"]*"\]).)*)/

它將提供您的鑰匙在比賽beforeafterdownloadtype結果。這裏

測試:http://www.regex101.com/r/mF2vN5

+1

我正在使用gskinner.com/RegExr/來測試我的表情......對於像我這樣的正則表達式的noobs來說,一個更好!即時發佈!現在就去測試它。 –

+0

@hakre:鏈接提供了一些很好的解釋,因此使用js – bukart