preg_match - 尝试获取数字序列的简单问题


preg_match - simple issue with trying to get sequence of digits

我正在尝试在PHP中进行一个相当简单的提取:

$empAward = 'AMW10';
if (preg_match("/'w+('d+)/",$empAward,$matches)) {
    $level = $matches[1]; // Wanted '10', but getting '0'
}
echo "Level is " . $level . "'n";

我希望我的正则表达式能够捕获最后 2 位数字,但它似乎只捕获最后一位数字,在本例中为 0。我想得到10个。有人可以解释我在这里做错了什么吗?我虽然 ''d+ 的规范会一直持续到它掌握所有数字,但它只是只得到最后一个字符。这可能与"贪婪"或任何相反的东西有关("慷慨"?!

谢谢大家皮特

这是工作示例,以及获取最后 2 个字符的解决方案

$empAward = 'AMW10';
preg_match('#[^W]+$#D', $empAward, $match);
echo "Output : ". $match[0]; // 10

输出

Output : 10

您的正则表达式不匹配,因为'w匹配[a-zA-Z0-9_],''d 匹配[0-9](假设我们不处于 unicode 模式(。所以基本上这里发生的事情,因为'w也匹配数字,是引擎看到令牌,这也是贪婪的,并匹配所有内容(整个字符串(。然后它注意到'd+,从而它必须回溯一步并再次尝试该模式。 然后,'w将匹配AMW1,然后'd+将成功匹配0。对于引擎来说,这完全没问题,因为它满足表达式。但显然它不能为你解决问题。

相反,你应该做的是更好地定义你的模式。您有几种选择:

  1. 确保在我们想要匹配的数字之前没有数字/[a-z]('d+)/i/'D('d+)/(有很多衍生物......
  2. 或者,如果它是您想要接收的固定值,您可以指定引擎应抓取的数字长度,从而确保您获得正确的结果:/'w+('d{2})/(再次,许多衍生品...

无论哪种方式,综上所述,我相信你会弄清楚:)

啊,

我想我想通了。

有效的正则表达式是:

/[A-Za-z]('d+)/

据我了解,正则表达式'w+匹配字母数字,直到数字正则表达式('d+),留下最后一个正则表达式只有一个字符要捕获。这是对'w+的正确解释吗?

很抱歉这么快就回到这个答案,我应该做更多的实验!

使用这个

preg_match("/'w('d+)+$/",$empAward,$matches);

使用以下模式:

"/[a-z]+('d+)/i"

$empAward = 'AMW10';
if (preg_match("/[a-z]+('d+)/i",$empAward,$matches)) {
    $level = $matches[1]; // Wanted '10', but getting '0'
}
echo "Level is " . $level . "'n";//Level is 10
Use This :
    if(preg_match("/[A-Za-z]('d+)/",$empAward,$matches)) {
    $level = $matches[1]; // Wanted '10', but getting '0'
    }
    echo "Level is " . $level . "'n";//Level is 10
Output : 
Level is 10