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

时间:2013-07-20 10:41:51

标签: php regex

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

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

我希望我的正则表达式会捕获最后两位数,但它似乎只抓住最后一位数,在这种情况下为0.我想得到10。 谁能解释我在这里做错了什么?我虽然\ d +的规格会一直持续到它掌握所有数字,但它只是单独得到最后一个字符。这可能与“贪婪”或其他相反的事情有关('慷慨'?!)

谢谢你们 皮特

6 个答案:

答案 0 :(得分:2)

以下是工作示例,并提供了获得最后2个字符的解决方案

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

<强>输出

Output : 10

答案 1 :(得分:1)

啊我想我想通了。

有效的正则表达式是:

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

根据我的理解,正则表达式\w+匹配alpha 数字,直到数字正则表达式(\d+),留下最后一个正则表达式,只捕获一个字符。这是\w+的正确解释吗?

很抱歉这么快回到这个答案,我应该多尝试一下!

答案 2 :(得分: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})/(再次,许多衍生物... )
  3. 无论哪种方式,所有这些说,我很确定你会弄明白:)

答案 3 :(得分:0)

使用此

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

答案 4 :(得分: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

答案 5 :(得分: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