使用PHP中的regexp preg_match()函数获取所有匹配项

时间:2015-02-26 11:30:26

标签: php regex preg-match

我使用preg_match在xml中搜索具有特定src或href模式的img元素。示例:< img src= "level1/level2/2837"< img href ='level1/level2/54322'

preg_match('/< *\/? *' // Begining of xml element
  . 'img' // "img" atribute
  . '[^>]*' // Any character except >
  . '(?:src|href) *= *' // src or href attribute with possible spaces between =
  . '(?:"|\')level1\/level2\/(\d+)(?:"|\')/', // "level1/level2/2837"
  $subject, $matches);

它有效但只返回第一场比赛。

例如,如果主题有此内容:

$subject = "< img  src= 'level1/level2/2837'/> <p>something</p> < img  href ='level1/level2/54322'";

我得到的结果是:

$matches => Array 
    ( 
        [0] => '< img  src= "level1/level2/2837"' 
        [1] => '2837' 
    ) 

如何获取$matches数组中的所有匹配项?

我已经使用simplexml_load_string来实现这一目标,但我想了解正则表达式如何与preg_match一起使用。

2 个答案:

答案 0 :(得分:2)

使用preg_match_all代替preg_match

答案 1 :(得分:2)

您需要将["|']转为(?:"|')。此['|"]符合'|"。此外,您还需要使用preg_match_all按顺序进行全局匹配。

preg_match_all('/< *\/? *'
  . 'img'
  . '[^>]*'
  . '(?:src|href) *= *'
  . '(?:"|\')level1\/level2\/(\d+)(?:"|\')/', 
  $subject, $matches);