您好我正在尝试匹配搜索字符串,以便如果我们的邮政编码位于字符串的开头,则返回邮政编码的匹配以及字符串的其余部分。这就是我到目前为止所拥有的
$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。
答案 0 :(得分:0)
^((\d{5})?(.*+))$
答案 1 :(得分:0)
您的匹配组3不是空格。它是空的(或者可能是未定义的或者其他东西 - 我没有深入参与PHP)。空值表示与可选组(-\d{4})
(US ZIP + 4)不匹配。我想你会想要保持你的表达,这样你就可以很容易地发现没有ZIP + 4的情况。
答案 2 :(得分:0)
答案是否。对模式括号进行目视检查表明第四个匹配将是-1234(四个额外的拉链数字 - 不知道它们正式被称为什么),在您的示例中,这是空的。从你的问题中有点不清楚你想要实际捕捉到什么。我会留下你可能会觉得有用的结构:
(?: ...)
如果你在paren之后有?:
,则表示不应该进行捕获。您可以在“破折号 - 四位数”子模式之前添加它,但不会将其添加到matches
。