我正在尝试在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
。对于引擎来说,这完全没问题,因为它满足表达式。但显然它不能为你解决问题。
相反,你应该做的是更好地定义你的模式。您有几种选择:
- 确保在我们想要匹配的数字之前没有数字
/[a-z]('d+)/i
或/'D('d+)/
(有很多衍生物...... - 或者,如果它是您想要接收的固定值,您可以指定引擎应抓取的数字长度,从而确保您获得正确的结果:
/'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