2016-01-20 74 views
0

我以爲我知道正則表達式,但我無法解決這個問題。正則表達式只捕獲組中的最後一項

試圖從中得到56。

$s = '<a href="../paye/56.html">'; 

用下面的正則表達式(PHP - preg_match

preg_match('/href="(.*(\d+)\.html)"/',$s,$m); 

但只給了我6

[ 
0 => 'href="../paye/56.html"', 
1 => '../paye/56.html', 
2 => '6' // Need this to be 56 
] 

正則表達式101正試圖幫助

一個重複的捕獲小組只會捕獲這個最後一次迭代。把 捕獲組周圍的重複組來捕獲所有迭代 或使用非捕獲組,而不是如果你不感興趣的 數據

但我在把捕獲組圍繞捕獲所有的嘗試沒有任何區別。

+0

對不起錯字,正則表達式我試圖爲的preg_match ; – Tim

回答

1
  1. (\d)+將匹配一個單一的數字,並把它捕獲組,該+量詞將匹配任何數字,但不會捕捉到它。捕獲所有數字將移動捕獲組內的+量詞。
  2. 使用?結束時,使第一部分.*非貪婪。

您不需要圍繞整個字符串的圓括號。僅捕獲URL中的最後一部分。

href=.*?(\d+)\.html 
    ^^

並訪問第一個捕獲的組。

代碼:( ' 「(*(\ d +)\ HTML)」/ HREF = /',$ S,$ M)

$re = "/href=.*?(\\d)+\\.html/"; 
$str = "\$s = '<a href=\"../paye/56.html\">';"; 

preg_match($re, $str, $matches); 
+0

[RegEx Demo](https://regex101.com/r/cO1aS7/2) – Tushar

+0

感謝這就是我錯過的一點「做第一部分。*最終使用非貪婪。」 – Tim