2012-08-10 98 views
0

我正在做一些正则表达式在PHP和匹配使用preg_match();preg_match捕获意外的子模式

我有可能会是这样的文字:

$imy = "...without sophisticated apparatus<div class="caption"><div class="caption-inner"> 
<img src="http://dev.mysite.org/Heatmap.png" alt="" title="" class="image-thumbnail" /> 
Caption text</div></div>Some more text... 
<img src="http://dev.mysite.org/Heatmap.png" alt="" title="" class="image-thumbnail" />blablah..." 

,我的目标是要挑选出无论是“IMG”标签封装在“格”标签(包括“分区”标签)或者只是“img”,如果它不包含在div中。我也在每种情况下都希望捕获包含在“img”标签的src属性中的地址。

这是我使用的模式:

$imagepattern = '/<div class="caption-inner[^>]+>.*<img\b[^>]*\bsrc="([^">]*)"[^>]*>.*<\/div>(<\/div>)?|<img\b[^>]*\bsrc="([^">]*)"[^>]*>/Us'; 

和它的伟大工程的“格”封闭的图像,但对于divless图像我得到捕获的子模式奇怪的结果。

我反复调用preg_match并从主题字符串中删除匹配,然后再次将其发送到preg_match。我到的preg_match调用如下:

preg_match($imagepattern,$imy,$image,PREG_OFFSET_CAPTURE) 

我让我的图像阵列中针对divless图像标签匹配时,看起来是这样的:

$image = [0] => Array 
     (
      [0] => <img src="http://dev.molmeth.org/Heatmap.png" alt="" title="" class="image-thumbnail" /> 
      [1] => 1 
     ) 

    [1] => Array 
     (
      [0] => 
      [1] => -1 
     ) 

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

    [3] => Array 
     (
      [0] => http://dev.mysite.org/Heatmap.png 
      [1] => 11 
     ) 

如何能在$图像阵列有“2 '和'3'键?我不只有一个子模式?这是否因为模式中的'或'条件?

回答

0

在preg_match表达式中,您有3个捕获组。由于

整个表达式匹配的或(因为你搜索DIV包括图像或图像divless),用于divless图像

,只捕获组3将填充数据和捕捉组1 & 2将是空的。