2012-08-10 53 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將是空的。