3

我正在尝试从这样的uris列表中解析一个整数:

uri.com/upload/123456789_abc.ext

我正在使用这种模式:

preg_match( "#uri\.com\/upload\/(.*?)_#is", $uri, $match );

哪个有效并返回:

Array
(
    [0] => uri.com/upload/123456789_
    [1] => 123456789
)

但我想知道是否有办法让 $match == "123456789" 而不是返回具有多个值的数组。

是否可以仅通过修改模式来做到这一点?

4

2 回答 2

6

它总是会返回一个数组,但您可以更改模式,使其只匹配您想要的。

$uri = "uri.com/upload/123456789_abc.ext";
preg_match('#(?<=uri\.com/upload/)\d+#is', $uri, $match );
print_r($match);

返回

数组( [0] => 123456789 )

所以它仍然是一个数组,但它只包含整个匹配项,即你的号码。

(?<=uri\\.com/upload/)是一个lookbehind,它与那个部分不匹配,所以它不是结果的一部分。

\d+仅匹配数字,因此_不再需要。

于 2012-05-06T20:20:11.413 回答
0

不在php中。另一方面,在 perl 中,您确实有自动变量,例如 $1、$2 引用最后一个匹配的正则表达式。也就是说,在您的示例中,执行匹配后, $1 变量将保存整数。

所以这个想法通常是可以的。你会喜欢 perl .. :-)

于 2012-05-06T18:02:36.040 回答