REGEX只查找PHP的街道号码

时间:2014-07-18 19:53:24

标签: php regex

我正在研究一个蜘蛛来按类型过滤联系信息,而且我遇到了似乎有很多承诺的正则表达式。唯一的问题是它需要整个邮寄地址才能通过审查。

^(?n:(?<address1>(\d{1,5}(\ 1\/[234])?(\x20[A-Z]([a-z])+)+ )|(P\.O\.\ 
Box\ \d{1,5}))\s{1,2}(?i:(?<address2>(((APT|B LDG|DEPT|FL|HNGR|LOT|PIER|RM|S
(LIP|PC|T(E|OP))|TRLR|UNIT)\x20\w{1,5})|(BSMT|FRNT|LBBY|LOWR|OFC|PH|REAR|SIDE|UPPR)\.?)
\s{1,2})?)(?<city>[A-Z]([a-z])+(\.?)(\x20[A-Z]([a-z])+){0,2})\, 
\x20(?<state>A[LKSZRAP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADL N]|K[SY]|LA|M
[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD] |T[NX]|UT|V[AIT]|W[AIVY])
\x20(?<zipcode>(?!0{5})\d{5}(-\d {4})?))$

我需要表达式只需要街道号和名称。但是,我并不了解每个表达方式是如何分解的。否则,我自己做出改变。 如何更改表达式以接受街道号码上最多4位数的邮件地址,后跟任何类型的单词(因为输入地址时没有强大的验证系统)?


目前接受的输入:

123 Park Ave Apt 123 New York City, NY 10002 
P.O. Box 12345 Los Angeles, CA 12304

目前拒绝输入:

123 Main St 
123 City, State 00000
123 street city, ST 00000

期望的接受输入:

123 Park Ave Apt 123 
P.O. Box 12345 
9784 Hwy 12
92 Main St
972 Smith dr

所需的拒绝输入:

123 Main St, New York NY 14676
123 City, State 00000
123 street city, ST 00000
12345 street

1 个答案:

答案 0 :(得分:1)

这可能是一个好的开始

/^(\d{1,4}|P\.O\.)([a-zA-Z\s]+)(\d+)?$/i    
/^(\d{1,4}|P\.O\.)\s([a-zA-Z0-9\s]+)\s?(\d+)?$/i
/^(\d{1,4}\s|P\.O\.)([a-zA-Z0-9\s]+)(\d+)?$/i

// passes
123 Park Ave Apt 123
P.O. Box 12345
9784 Hwy 12
92 Main St
972 Smith dr
1809 Caddo St
10200 Highway 5 North

// fails 
123 Main St, New York NY 14676
123 City, State 00000
123 street city, ST 00000
12345 street

用法:

<?php

$address = "123 Park Ave Apt 123";
$pattern = '/^(\d{1,4}|P\.O\.)([a-zA-Z\s]+)(\d+)?$/i';
if(preg_match($pattern, $address, $matches)){
    echo $matches[0];
}

?>

正在测试......:)

RegEx Fiddle