正则表达式只捕获组中的最后一项

时间:2016-01-20 03:57:14

标签: php regex

我以为我知道正则表达式,但我无法解决这个问题。

试图从中获得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
]

Regex 101正在尝试帮助

  

重复捕获组仅捕获最后一次迭代。放   重复组周围的捕获组捕获所有迭代   如果您对此不感兴趣,请使用非捕获组   数据

但我所有尝试将捕获组放在捕获周围的尝试并没有什么不同。

1 个答案:

答案 0 :(得分:1)

  1. (\d)+将匹配单个数字并将其放入捕获组,+量词将匹配任何数字,但不会捕获它。要捕获所有数字,请移动捕获组内的+量词。
  2. 最后使用.*使第一部分?非贪婪。
  3. 整个字符串周围不需要括号。仅捕获URL中的最后一部分。

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

    访问第一个捕获的组。

    <强>代码:

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