Как заставить мое регулярное выражение извлекать информацию, а не просто проверять - PullRequest
1 голос
/ 27 октября 2011

У меня есть регулярное выражение для проверки, является ли строка почтовым индексом или нет. Но мне бы очень хотелось иметь возможность извлечь его из полного адреса (или, если возможно, из любой строки).

Вот мое текущее регулярное выражение:

/^((\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 ]

2 голосов
/ 27 октября 2011

preg_match, который, как я полагаю, вы уже используете, когда проверяете строку по своему регулярному выражению, также возвращает фактический текст, соответствующий вашему шаблону.

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

Третий аргумент заполняется результатами попыток сопоставить регулярное выражение с вашими данными. $matches[0] будет содержать текст, который соответствует всему шаблону, в то время как более высокие индексы будут содержать текст, который сопоставляется с захватом подшаблонов (части шаблона, заключенные в скобки).

Однако, в вашем случае, вы включили свой шаблон с символами начала ввода ^ и конца ввода $, что означает, что любые совпадения должны включать весь входная строка (или целая строка в многострочном режиме). Вам придется избавиться от ^ и $, прежде чем пытаться использовать этот шаблон для извлечения почтового кода из более крупной строки.

2 голосов
/ 27 октября 2011

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);
0 голосов
/ 12 января 2012

Поскольку вы работаете с полным адресом, почему бы не использовать сервис, который может точно извлечь и проверить адрес и проанализировать его компоненты (включая полный почтовый индекс), предоставляя хороший ответ? Это, безусловно, устранит любые догадки. На снимке экрана ниже показан инструмент SmartyStreets, который может извлекать адреса из всех видов текста. В целях полного раскрытия я являюсь разработчиком программного обеспечения на SmartyStreets .

https://smartystreets.com/account/extract

LiveAddress extraction

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...