2013-01-05 157 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