我正在尝试用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 +的规格会一直持续到它掌握所有数字,但它只是单独得到最后一个字符。这可能与“贪婪”或其他相反的事情有关('慷慨'?!)
谢谢你们 皮特
答案 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
。对于引擎来说,这完全没问题,因为它满足了表达式。但很明显,它不适合你。
你应该做的是更好地定义你的模式。你有几个选择:
/[a-z](\d+)/i
或/\D(\d+)/
之前没有数字(有很多衍生品......)/\w+(\d{2})/
(再次,许多衍生物... )无论哪种方式,所有这些说,我很确定你会弄明白:)
答案 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