regex — проверка адреса улицы с переполнением стека

Мне нужно проверить полный адрес, используя 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 Креморн, Австралия

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

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

-3

Решение

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

\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)
3

Другие решения

Я не специалист по php, но помогает ли это? Проверка PHP: 1-я строка адреса и почтовый индекс

иначе вы можете попробовать:

Вот бесплатный и своего рода «нестандартный» способ сделать это. Не на 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) (в описании формата есть две запятые, которых нет в ваших примерах)

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

1

Вот решение, которое я придумал: эта функция предполагает, что адрес улицы проверяется индивидуально; отдельно от города, штата и почтового индекса, но включение полного адреса не приведет к сбою проверки. Я просто хочу убедиться, что адрес улицы начинается с цифры и включает название улицы. Я также хочу убедиться, что если название улицы является числом (например, 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;
}
0
По вопросам рекламы [email protected]