如何让我的正则表达式提取信息,而不仅仅是检查

时间:2011-10-27 19:12:53

标签: php regex street-address zipcode postal-code

我有一个正则表达式,用于检查字符串是否为邮政编码或邮政编码。但我真的希望能够从完整地址(或者,如果可能的话,任何字符串)中提取它。

这是我目前的正则表达式:

/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/

如果有必要,我愿意接受一个函数(我正在用PHP检查),但是如果可能的话,我宁愿使用正则表达式来完成工作。

3 个答案:

答案 0 :(得分:2)

PHP会将()中的分组提取到一个包含preg_match()

的数组中
$matches = array();
$pattern = "/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/";
preg_match($pattern, $your_source, $matches);
print_r($matches);

答案 1 :(得分:2)

preg_match,我假设您在使用正则表达式检查字符串时已经在使用,还会返回与您的模式匹配的实际文本。

preg_match($regex, $input, $matches);
echo $matches[0];

第三个参数填充了尝试将正则表达式与输入匹配的结果。 $matches[0]将包含与整个模式匹配的文本,而较高的索引将包含与捕获子模式匹配的文本(括在括号中的模式部分)。

但是,在您的情况下,您已使用输入开始^和输入结束$字符包含模式,这意味着任何匹配都必须包含整个输入字符串(或多行模式下的整行)。在尝试使用此模式从较大的字符串中提取邮政编码之前,您必须删除^$

答案 2 :(得分:0)

由于您使用的是完整地址,为什么不依赖可以准确提取和验证地址并解析其组件(包括完整的邮政编码)的服务,从而提供良好的响应?它肯定会消除任何猜测。下面的屏幕截图显示了SmartyStreets的一个工具,它可以从各种文本中提取地址。为了完全披露,我是SmartyStreets的软件开发人员。

https://smartystreets.com/account/extract

LiveAddress extraction