如何不匹配preg_match中括号内的模式

时间:2013-03-11 13:15:13

标签: php regex preg-match-all

我正在尝试从网页获取所有图片代码的src。但我很困惑如何不匹配括号内的模式。在这种情况下gif|jpg|png|jpeg

$img_src_pattern = '/src="?.+\.(gif|jpg|png|jpeg)"/';
preg_match_all($img_src_pattern, $contents, $img_matches);

因此,当打印出$img_matches时,我得到一个这样的数组:

Array ( 
  [0] => Array ( 
    [0] => src="http://s9.addthis.com/button1-bm.gif" 
    [1] => src="http://s9.addthis.com/button1-bm.gif" ) 
  [1] => Array ( [0] => gif [1] => gif ) 
)

这就是我想要的:

Array ( 
  [0] => Array ( 
    [0] => src="http://s9.addthis.com/button1-bm.gif" 
    [1] => src="http://s9.addthis.com/button1-bm.gif" ) 
)

这真是preg_match的一部分让我感到困惑。你能告诉我这个吗?

1 个答案:

答案 0 :(得分:4)

你可以忽略它,因为它属于数组中的另一个索引。

或者您可以将捕获组(pattern)更改为非捕获组(?:pattern)

'/src="?.+\.(?:gif|jpg|png|jpeg)"/'

除了找到与整个正则表达式匹配之外,您当前的正则表达式还“捕获”(即记住)正则表达式gif|jpg|png|jpeg匹配的文本,因为捕获组()周围的效果它。非捕获组将保留分组属性,但不会捕获子表达式gif|jpg|png|jpeg匹配的文本。

preg_match_all输出一个二维数组,其中第一个维度是捕获组(索引0将包含整个正则表达式匹配的文本),第二个维度是它找到的匹配项的id