2013-11-20 22 views
0

使用分隔符是更好的方式與我有困難理解的preg_match function.An如的preg_match

$subject="XY=abC%3Fedr%3Damp;35" 

我想使用的preg_match提取

公元前%3Fed

並存儲在變量中

if(preg_match($pattern, $subject, $matches)) 
      { 
       $string = $matches[1]; 
      } 
echo $string; 

這裏有不同的變化,我使用的$模式

我想用@作爲分隔符

@bC(.*?)@ 
@bC.*[email protected] 

我只是不明白爲什麼它不工作,我想什麼是錯的$模式。

請不要使用複雜的正則表達式,並試圖解決我的嘗試,因爲這裏的目的是瞭解preg_match如何工作,以及這裏出了什麼問題。

問候

回答

1

使用@作爲分隔符是確定的,但正則表達式是錯誤的。我想你想:

@(bC.*?)[email protected] // matches @bC and the following characters unless and 'r' (see comments) 

一個很好的起點,以學習正則表達式的語法是PCRE manual


例子:

$subject="XY=abC%3Fedr%3Damp;35"; 
$pattern="@(bC.*?)[email protected]"; 

preg_match($pattern, $subject, $matches); 
$string = $matches[1]; 

echo $string; // bC%3Fed 
+0

你怎麼知道它會在$匹配[0] – user2650277

+0

它是第一個也是唯一的*「匹配組」*這就是爲什麼'$匹配[0]'。如果你不確定使用'var_dump($ matches);' – hek2mgl

+0

謝謝關鍵是我想提取bC和r之間的所有字符。在真實情況下,我不知道要提取的字符的確切數量 – user2650277

1

的?之後。*切換模式的貪婪。默認模式是貪婪的,他們試圖找到最長的匹配。那麼你 。*?意味着任何字符,任何數字,最小匹配。因爲在這之後什麼也沒有,所以最小的匹配是一個空字符串。