use*_*269 1 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);
Run Code Online (Sandbox Code Playgroud)
所以当打印出来时,$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 )
)
Run Code Online (Sandbox Code Playgroud)
这就是我想要得到的:
Array (
[0] => Array (
[0] => src="http://s9.addthis.com/button1-bm.gif"
[1] => src="http://s9.addthis.com/button1-bm.gif" )
)
Run Code Online (Sandbox Code Playgroud)
这真的preg_match使我感到困惑。你能启发我吗?
您可以忽略它,因为它属于数组中的另一个索引。
或者,您可以将捕获组(pattern)更改为非捕获组(?:pattern):
'/src="?.+\.(?:gif|jpg|png|jpeg)"/'
Run Code Online (Sandbox Code Playgroud)
您的当前正则表达式除了找到与整个正则表达式匹配的内容外,还gif|jpg|png|jpeg因为捕获()周围的正则集,因此也“捕获”(即记住)正则表达式匹配的文本。非捕获组将保留分组属性,但不会捕获与子表达式匹配的文本gif|jpg|png|jpeg。
preg_match_all 输出一个二维数组,其中第一个维度是捕获组(索引0将包含与整个正则表达式匹配的文本),第二个维度是找到的匹配项的ID。