2013-03-14 26 views
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 

?> 

換句話說,我需要找到一個匹配,但我也需要指定進入數組的內容。

由於我無法學習這一點,如果您不只是回答代碼,而且還要解釋它的作用,我將不勝感激。謝謝!

+1

您需要將重複計數放在括號內。 – Barmar 2013-03-14 01:12:50

+0

請注意,它將在'$ matches [1]'中,而不是'$ matches [0]'中。 – 2013-03-14 01:15:59

+0

爲了擴展@DavidKiger所說的內容,它不會出現在'$ matches [0]'中,因爲它匹配整個['preg_match'](http://www.php.net/manual/en/function.preg- match.php)字符串。 – Jon 2013-03-14 01:21:00

回答

5

試試這個:

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

在代碼中,捕獲組只匹配一個字符。這匹配捕獲組內的1-7個數字。

+0

謝謝!所以對於每組圓括號,另一個項目被添加到$ matches數組中? – hellohellosharp 2013-03-14 01:16:53

+1

是的,但要再次注意整個匹配的字符串在'$ matches [0]'中,所以你的第一個括號將是'$ matches [1]'。 – 2013-03-14 01:19:10

+0

@hellohellosharp沒錯。但是,如果在括號組上有一個重複操作符,則只有一個項目項(第一個或最後一個匹配項,取決於我認爲的實現)被添加到'$ matches'中,無論重複多少次。 – Barmar 2013-03-14 01:49:43

0

圓括號捕獲匹配表達式的一部分並將其存儲在$ matches [1]中。這是獲得你想要的東西的最佳方式。只要將關閉括號到{1,7}部分的權利:

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

爲了討論:

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

(?<=)是回顧後操作,其不僅外觀是否匹配是由這個之前,但它實際上並不是結果匹配的一部分,但是我仍然很難想出爲什麼它有0'th index ....只是說$id=$matches[1],並且你有你的數據?

+0

謝謝!原諒我......它根本不需要在第0指數,只需要在那裏。 – hellohellosharp 2013-03-14 01:19:06

+0

啊,是的,我現在看到了,我忽略了只有第一個數字在你的比賽中的部分。那麼,@Barmar在這種情況下是正確的,只是把它看作一個古怪的噱頭;) – Wrikken 2013-03-14 01:22:31