2013-04-30 66 views
0

我的代碼運行良好 - 但我不明白結果。我的目標是確保傳入的值是這些格式之一:正則表達式preg_match返回的結果太多了嗎?

  • 00000-0000

PHP:

$str = '12345-6789'; 
preg_match('/^[0-9]{5}(-?[0-9]{4})?$/', $str, $found); 
print_r($found); 

返回:

Array 
(
    [0] => 12345-6789 
    [1] => -6789 
) 

爲什麼我會得到第二個結果[1] => -6789

謝謝!

回答

1

括號周圍(-?...導致它被捕獲。 $found的第零個條目包含整個匹配,並且每個後續條目包含每個捕獲的組。這可能是好的,但如果你絕對不希望捕捉到,你可以使用非捕獲組:

(?:-?[0-9]{4})? 
+0

謝謝!我知道了。有點像Apache反向引用。 – 2013-04-30 16:52:15

+0

@jared_flack他們不是特定於Apache。反向引用是對同一個表達式中被捕獲的組的引用(例如,'(\ d)\ 1' - '1'是對所捕獲的數字的反向引用)。 – 2013-04-30 16:57:48

2

這是因爲你必須爲你使用()的捕獲組:

$str = '12345-6789'; 
preg_match('/^[0-9]{5}(-?[0-9]{4})?$/', $str, $found); 
//     ^  ^
print_r($found); 

您可以使用?:,以確保它是不可捕獲:

$str = '12345-6789'; 
preg_match('/^[0-9]{5}(?:-?[0-9]{4})?$/', $str, $found); 
//      ^^ 
print_r($found); 
1

-()裏面這就是所謂的capture block,這些塊是比賽,PHP將返回。

$str = '12345-6789'; 
preg_match('/^[0-9]{5}-?([0-9]{4})?$/', $str, $found); 
print_r($found); 
+0

這將匹配'12345-' – Toto 2013-05-01 09:33:21