正则表达式noob需要一个模式来匹配特定的字符串模式

时间:2012-04-26 04:26:05

标签: php regex

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

$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
)

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

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

答案是。对模式括号进行目视检查表明第四个匹配将是-1234(四个额外的拉链数字 - 不知道它们正式被称为什么),在您的示例中,这是空的。从你的问题中有点不清楚你想要实际捕捉到什么。我会留下你可能会觉得有用的结构:

(?: ...)

如果你在paren之后有?:,则表示不应该进行捕获。您可以在“破折号 - 四位数”子模式之前添加它,但不会将其添加到matches