0

我已经研究了半个小时,仍然无法弄清楚。我相信这很简单。

我想匹配一个 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

?>

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

由于我在学习这一点时遇到了困难,如果您不仅用代码回答,而且还解释它的作用,我将不胜感激。谢谢!

4

3 回答 3

5

试试这个:

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

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

于 2013-03-14T01:13:40.393 回答
0

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

preg_match("/ID: (\d{1,7})/", $string2, $matches);
$id = $matches[1];
于 2013-03-14T01:16:50.880 回答
0

为了争论:

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

(是一个lookbehind运算符,它只查看匹配是否在此之前,但它实际上并不是结果匹配的一部分。然而,我很难想到它必须在第'th 索引(?<=)中的正当理由......只是说,你有你的数据吗?0$id=$matches[1]

于 2013-03-14T01:17:27.197 回答