2012-04-25 76 views
2

这应该很简单,但我努力让这个preg_match工作。

我想从这样的“/页/ 30 /” 其中$匹配一个url捕捉页码[0]会返回30

$uri = "/page/30/"; 
$pat = "/^\/page\/(\d+)$/"; 
preg_match($pat, $uri,$matches); 
print_r($matches); //should print 30 

我在做什么错?

回答

4

主要的原因,你没有得到一个输出(如格雷格说),你忘了结尾的斜线在您的模式。

作为一个提示,如果您想从字面上匹配/,请使用不同的正则表达式分隔符,以避免跳过斜线。

因此,这将匹配你的格局:

$uri = "/page/30/"; 
$pat = "~^/page/(\d+)/$~"; 
preg_match($pat, $uri, $matches); 
print_r($matches); //should print 30 

然后有一个误区,$matches返回了包含$matches[0]全场比赛,然后匹配组的数组。

所以,如果你想打印30你需要做的:

print($matches[1]); 

,因为数字存储第一捕获小组。

3
$uri = "/page/30/"; 
$pat = "/(?<=^\/page\/)\d+/"; 
preg_match($pat, $uri, $matches); 
print_r($matches); //should print 30 

将正则表达式更改为/(?<=^\/page\/)\d+/。有关说明,请参阅lookaround assertions上的教程。

1

你无视尾部斜线。这应该正确地匹配它:

$pat = "/^\/page\/(\d+)\/$/"; 
+0

这不是问题所在。 – 2012-04-25 05:08:23

+0

问题是模式中包含行尾字符,而没有考虑尾部斜线。您的解决方案也适用,因为您没有包含行尾字符。 – gcochard 2012-04-25 15:28:15