1

嗨,我正在尝试匹配搜索字符串,以便如果我们的邮政编码位于字符串的开头,则返回邮政编码的匹配项以及字符串的其余部分。这就是我到目前为止所拥有的

$str = "90210 Beverly Hills, CA";
$res = preg_match('/^((\d{5})(-\d{4})?)\s+(.+?)$/', $str, $matches);

但是当我 print_r 匹配时,它会返回一个额外的空间键。

Array
(
    [0] => 90210 Beverly Hills, CA
    [1] => 90210
    [2] => 90210
    [3] =>
    [4] => Beverly Hills, CA
)

无论如何我可以改进模式并返回不是空字符串的匹配项吗?这个实例有更好的模式吗?此外,如果只给出一个邮政编码或一个文本字符串,它将返回 false。

4

3 回答 3

0
^((\d{5})?(.*+))$

http://rubular.com/r/bZJe4p1k9O

于 2012-04-26T04:33:29.680 回答
0

您的匹配组 3 不是空格。它是空的(或者可能是未定义的或其他东西 - 我没有深入参与 PHP)。空值表示与可选组(-\d{4})(US ZIP+4) 不匹配。我想你会想要保持你的表情不变,这样你就可以很容易地检测到没有 ZIP+4 的情况。

于 2012-04-26T04:38:16.560 回答
0

答案是否定的。对模式括号的目视检查表明第四个匹配项是 -1234 (四个额外的邮政编码——不知道它们的正式名称),在你的示例中,它是空的。您的问题有点不清楚您想要实际捕获什么。我会留下一个你可能会觉得有用的构造:

(?: ...)

如果您有?:括号,则表示不应进行捕获。您可以在“破折号四位数”子模式之前添加它,它不会被添加到matches.

于 2012-04-26T04:39:55.413 回答