如何只返回与preg_match匹配的匹配项

时间:2012-05-06 17:57:43

标签: php regex pattern-matching preg-match

我试图从这样的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”返回一个包含多个值的数组。

是否可以通过仅修改模式来实现?

2 个答案:

答案 0 :(得分:5)

它将始终返回一个数组,但您可以更改该模式,以便它只匹配您想要的。

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

返回

  

数组([0] =&gt; 123456789)

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

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

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

答案 1 :(得分:0)

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

所以这个想法一般都没问题。你会喜欢perl ..: - )