1

我正在尝试从网页中获取所有图像标签的 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让我感到困惑的部分。你能启发我吗?

4

1 回答 1

5

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

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

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

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

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

于 2013-03-11T13:17:52.703 回答