正则表达式,preg_match,返回太多结果?

时间:2013-04-30 16:20:00

标签: php regex preg-match

我的代码运行良好 - 但我不明白结果。我的目标是确保传入的值是以下格式之一:

  • 00000-0000
  • 000000000
  • 00000

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

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:1)

围绕(-?...的括号使其被捕获。 $found的第0个条目包含整个匹配项,每个后续条目包含每个捕获的组。这可能没问题,但如果您绝对不想捕获,可以使用非捕获组:

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

答案 2 :(得分:1)

-位于名为()的{​​{1}}内,这些块是PHP将返回的匹配项。

capture block