PHP preg_match正则表达式捕获字符串中的模式

时间:2013-01-05 23:56:55

标签: php regex

每当我需要使用它时,我似乎无法正确使用正则表达式...

给出像这样的字符串:

$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查询,然后打印字符串的其余部分...(如果更多的话,再次重复[download]存在于字符串中。

到目前为止,我有以下正则表达式

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

但这只是捕获以下内容:

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

我正在使用preg_match()...我应该使用preg_match_all()吗?无论如何......正则表达式肯定是错的......任何帮助?

2 个答案:

答案 0 :(得分: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
                                                      ##    ##

答案 1 :(得分:1)

尝试使用“小”一个

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

它会在匹配结果中为您提供密钥beforeafterdownloadtype

在此测试:http://www.regex101.com/r/mF2vN5