0

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

  • 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

谢谢!

4

3 回答 3

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);
于 2013-04-30T16:23:35.293 回答
1

周围的括号(-?...会导致它被捕获。的第零个条目$found包含整个匹配项,每个后续条目包含每个捕获的组。这可能很好,但如果您绝对不想捕获,您可以使用非捕获组:

(?:-?[0-9]{4})?
于 2013-04-30T16:24:17.027 回答
1

-()that's called的内部capture block,这些块是 PHP 将返回的匹配项。

$str = '12345-6789';
preg_match('/^[0-9]{5}-?([0-9]{4})?$/', $str, $found);
print_r($found);
于 2013-04-30T16:25:36.413 回答