在preg_match中指定$ matches中的内容

时间:2013-03-14 01:11:25

标签: php regex preg-match

我一直在研究这个半小时但仍然无法弄明白。我相信这很简单。

我想匹配一个id,但前面只有“ID:”。

<?php
$string1 = "Payment: 1474";
$string2 = "Payment ID: 1474";

preg_match('/ID: ([0-9]){1,7}$/', $string1, $matches);

//array(0){} Good! This is the expected result.

preg_match('/ID: ([0-9]){1,7}$/', $string2, $matches);

//array(2) { [0]=> string(8) "ID: 1474" [1]=> string(1) "4" }
//I am glad it finds a match, but I want matches[0] to be only the id, 1474

?>

换句话说,我需要找到一个匹配但我还需要指定进入数组的内容。

由于我在学习这个问题时遇到了麻烦,如果您不仅仅回答代码而且还要解释它的作用,我将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:5)

试试这个:

preg_match('/ID: ([0-9]{1,7})$/', $string2, $matches);

在您的代码中,捕获组只匹配一个字符。这匹配捕获组内的1-7个数字。

答案 1 :(得分:0)

括号捕获匹配表达式的一部分并将其存储在$ matches [1]中。这是获得您想要的最佳方式。只需将关闭的paren移动到{1,7}部分的右侧:

preg_match("/ID: (\d{1,7})/", $string2, $matches);
$id = $matches[1];

答案 2 :(得分:0)

为了论证:

  preg_match('/(?<=ID: )[0-9]{1,7}$/', $string2, $matches);

(?<=)是一个外观操作员,它只查看匹配是否在此之前,但它实际上并不是结果匹配的一部分。但是我很难想到它为什么有正当理由位于0'索引中....只需说出$id=$matches[1],你就有了数据吗?