2016-01-20 39 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