【问题标题】:Regex is only capturing the last item in group正则表达式仅捕获组中的最后一项
【发布时间】:2016-04-25 18:48:39
【问题描述】:

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

试图从中得到 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 正在尝试帮助

重复捕获组将仅捕获最后一次迭代。放 围绕重复组的捕获组以捕获所有迭代 或者如果您对 数据

但我所有尝试围绕该捕获设置一个捕获组并没有产生任何影响。

【问题讨论】:

  • 抱歉打错了,我尝试的正则表达式是 preg_match('/href="(.*(\d+)\.html)"/',$s,$m);

标签: php regex


【解决方案1】:
  1. (\d)+ 将匹配单个数字并将其放入捕获组,+ 量词将匹配任何数字,但不会捕获它。要捕获所有数字,请在捕获组内移动 + 量词。
  2. 最后使用? 使第一部分.* 不贪婪。

您不需要完整的字符串周围的括号。仅捕获 URL 中的最后一部分。

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

并访问第一个捕获的组。

代码:

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

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

【讨论】:

  • 谢谢,这是我遗漏的一点“最后使用 ? 使第一部分 .* 不贪婪。”
猜你喜欢
  • 2020-12-16
  • 2013-06-27
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多