2015-07-28 1 views
-3

Мне нужно проверить полный адрес, используя php и regex. Это то, что я создал до сих пор.Проверка адреса улицы с помощью PHP

<?php 

$input = '15 Gordon St, 3121 Cremorne, Australia'; 
if (!preg_match('/^[^@]{1,63}@[^@]{1,255}$/', $input)) { 
    echo 'Not matched'; 
} else { 
    echo 'Matched'; 
} 

Адрес образца.

15 Gordon St, 3121 Cremorne, Австралия

Это возвращает ложь.

#, название улицы, почтовый индекс, город, страна - формат адреса.

+6

Этот RegEx предназначен для адресов электронной почты ... заставляет меня задаться вопросом, вы только что скопировали его или вы действительно знаете RegEx. – Siguza

+1

, если это предоставленный пользователем бесплатный текст, вы можете найти эту задачу практически невозможной. если у вас есть время, интересное чтение - это «лживые программисты верят в адреса» https://www.mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses/ – frymaster

ответ

3

Ваше регулярное выражение очень похоже на валидацию адреса электронной почты, которая настоятельно предполагает, что вы вообще не знакомы с регулярным выражением.
Я даже не собираюсь утверждать, что это вопрос «gimme teh codez», но, честно говоря, вам следует изучить регулярное выражение, если вы собираетесь его использовать.

\d+ = одна или более цифр
[a-zA-Z ]+ = один или более из: прописной буквы, строчная буква, пространство

Поэтому:

preg_match('/^\\d+ [a-zA-Z ]+, \\d+ [a-zA-Z ]+, [a-zA-Z ]+$/', $input) 

Что также может быть сокращен до:

preg_match('/^(?:\\d+ [a-zA-Z ]+,){2}[a-zA-Z ]+$/', $input) 
1

Я не специалист PHP, но это поможет ?: PHP Validation: 1st Line of address and postcode

еще можно попробовать:

Вот бесплатно и своего рода «вне коробки» способ сделать это. Не 100% совершенный, но он должен отвергать вопиющие несуществующие адреса.

Отправить весь адрес в веб-службу геокодирования Google (https://developers.google.com/maps/documentation/geocoding/intro). Эта служба пытается вернуть точные координаты местоположения, которое вы его подаете, то есть широта и долгота.

По моему опыту, если адрес недействителен, вы получите результат 602 из службы. Определенно существует вероятность ложных срабатываний или ложных негативов, но используется в сочетании с другими проверками согласованности, которые могут быть полезны.

(веб-служба геокодирования Yahoo, с другой стороны, вернет координаты центра города, если город существует, но остальная часть адреса является фиктивной. Потенциально полезно, если вы уделяете пристальное внимание " точность "в результате).

1

С учетом ваших примеров: preg_match('/^[0-9]+ [^,]+, [0-9]+ [^,]+, [a-z]+$/', $input)

Учитывая ваш формат: preg_match('/^[0-9]+, [^,]+, [0-9]+, [^,]+, [a-z]+$/', $input) (есть две запятые в описании формата, которые не находятся в ваших примерах)

[^,] = все, но ,

0

Вот решение, которое я придумал с: Эта функция предполагает, что адрес улицы проверяется индивидуально; отдельно от города, штата и почтового индекса, но включая полный адрес, не приведет к сбою проверки.Я просто хочу убедиться, что уличный адрес начинается с численного и включает название улицы. Я также хочу убедиться, что если название улицы является номером (например, 35-я ст.), то проверка не завершается.

// Checks for a street number and street name. 
// Allows street names to begin w/ numbers. 
// eg. '123 35th St.' will pass 
// eg. 'West 35th St.' will not pass 
function validate_street_address($string) { 
$check_pattern = '/\d+ [0-9a-zA-Z ]+/'; 
$has_error = !preg_match($check_pattern, $string); 
// Returns boolean: 
// 0 = False/ No error 
// 1 = True/ Has error 
return $has_error; 
}