Мне нужно проверить полный адрес, используя php и regex. Это то, что я создал до сих пор.
<?php
$input = '15 Gordon St, 3121 Cremorne, Australia';
if (!preg_match('/^[^@]{1,63}@[^@]{1,255}$/', $input)) {
echo 'Not matched';
} else {
echo 'Matched';
}
Образец адреса.
Ул. Гордон 15, 3121 Креморн, Австралия
Это возвращает ложь.
#, Название улицы, почтовый индекс, город, страна это формат адреса.
Ваше регулярное выражение очень похоже на проверку адреса электронной почты, что настоятельно рекомендует вам вообще не знать регулярное выражение.
Я даже не собираюсь утверждать, что это вопрос «дай мне кодез», но, честно говоря, ты должен выучить регулярные выражения, если собираешься его использовать.
\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)
Я не специалист по php, но помогает ли это? Проверка PHP: 1-я строка адреса и почтовый индекс
иначе вы можете попробовать:
Вот бесплатный и своего рода «нестандартный» способ сделать это. Не на 100% идеально, но он должен отвергать явно несуществующие адреса.
Отправьте полный адрес в веб-службу геокодирования Google (https://developers.google.com/maps/documentation/geocoding/intro). Эта служба пытается вернуть точные координаты местоположения, в которое вы ее вводите, то есть широту и долготу.
По моему опыту, если адрес неверен, вы получите результат 602 от службы. Существует определенная вероятность ложных срабатываний или ложных отрицательных результатов, но в сочетании с другими проверками согласованности это может быть полезно.
(С другой стороны, веб-служба геокодирования Yahoo будет возвращать координаты центра города, если город существует, но остальная часть адреса является поддельной. Потенциально полезна, если вы внимательно изучите поле «точность» в результат).
Учитывая ваши примеры:
preg_match('/^[0-9]+ [^,]+, [0-9]+ [^,]+, [a-z]+$/', $input)
Учитывая ваш формат:
preg_match('/^[0-9]+, [^,]+, [0-9]+, [^,]+, [a-z]+$/', $input)
(в описании формата есть две запятые, которых нет в ваших примерах)
[^,]
= все, но ,
Вот решение, которое я придумал: эта функция предполагает, что адрес улицы проверяется индивидуально; отдельно от города, штата и почтового индекса, но включение полного адреса не приведет к сбою проверки. Я просто хочу убедиться, что адрес улицы начинается с цифры и включает название улицы. Я также хочу убедиться, что если название улицы является числом (например, 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;
}