0

我正在尝试在 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+ 的规范会继续下去,直到它掌握所有数字,但它只得到最后一个字符。这可能与“贪婪”或与之相反的任何事情有关(“慷慨”?!)

谢谢大家皮特

4

6 回答 6

2

这是工作示例,并使用您的解决方案来获取最后 2 个字符

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

输出

Output : 10
于 2013-07-20T10:52:37.337 回答
1

啊,我想我明白了。

有效的正则表达式是:

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

据我了解,正则表达式\w+匹配 alpha数字,直到 numeric regex (\d+),最后一个正则表达式只需要捕获一个字符。这是对的正确解释\w+吗?

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

于 2013-07-20T10:46:41.647 回答
1

您的正则表达式无法匹配,因为\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})/再一次,许多导数......)

不管怎样,说了这么多,我很确定你会弄明白的:)

于 2013-07-20T11:04:26.297 回答
0
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 
于 2013-07-20T11:00:07.293 回答
0

用这个

preg_match("/\w(\d+)+$/",$empAward,$matches);
于 2013-07-20T10:48:59.103 回答
0

使用这种模式:

"/[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
于 2013-07-20T10:53:45.370 回答