2013-04-30 67 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