Формат поиска адреса с регулярным выражением - PullRequest
1 голос
/ 25 ноября 2011

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

Соответствующие части базы данных, в которой содержится информация, по которой они должны искать:

streetname      "Stora gatan"
streetnumber    "34"
streetletter    "B"
address         "Stora gatan 34B"

Эта база данных предоставлена ​​моим клиентом и, как вы можете видеть, аккуратно отформатирована.Подавляющее большинство данных, которые ищет посетитель:

"Stora gatan"
"Stora gatan 34"
"Stora gatan 34b"
"Stora gatan 34 b"

Это форматы only , которые мне интересны в данный момент. Это шведское приложение, и вот какадреса отформатированы / набраны в Швеции.Любые дикие версии вышеупомянутых (скажем, если пользователь должен искать «34 Storgatan B», ничего не будет соответствовать, и это было бы вполне нормально.

Также крайне нежелательно, чтобы в форме заявки было три поля поиска).вместо одного, поэтому данные в одной строке.

Теперь, как вы можете видеть, один из приведенных выше условий поиска потерпит неудачу, несмотря на то, что он является допустимым способом ввода адреса.с пробелом между числом и буквой адреса.

Итак, я написал это регулярное выражение, чтобы перехватить все входящие запросы и, надеюсь, поменять их на правильные:

if (preg_match("/^(.*?)\s*(\d*?)\s*([A-Za-z]*?)$/", $address, $m)){
    $streetname = uc_words($m[1]);
    $streetnumber = trim($m[2]);
    $streetletter = strtoupper($m[3]);
    $search = trim($streetname . SPACE . $streetnumber . $streetletter);
}

К сожалению, это не такЭто действительно работает, как я и надеялся. Полученный $ m будет выглядеть так для каждого из моих примеров выше:

Неправильно:

Array
(
    [0] => Stora gatan
    [1] => Stora
    [2] => 
    [3] => gatan
)

Правильно:

Array
(
    [0] => Stora gatan 34
    [1] => Stora gatan
    [2] => 34
    [3] => 
)

Правильно:

Array
(
    [0] => Stora gatan 34b
    [1] => Stora gatan
    [2] => 34
    [3] => b
)

У вас, ребята, есть какие-нибудь указатели на всеобъемлющее выражение, или вы бы предложили сделать еще несколько, если / еще перехватывает перед регулярным выражением? Любой ввод приветствуется.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Попробуйте это (не самое красивое регулярное выражение, но оно работает):

$address = "Stora gatan 34 b";
preg_match("/([a-zA-Z ]+) ?([0-9]+)? ?([a-zA-Z]+)?/", $address, $m);

print_r($m);

Результаты:

$address = "Stora gatan 34 b";
Array ( [0] => Stora gatan 34 b [1] => Stora gatan [2] => 34 [3] => b ) 

$address = "Stora gatan 34b";
Array ( [0] => Stora gatan 34b [1] => Stora gatan [2] => 34 [3] => b ) 

$address = "Stora gatan 34";
Array ( [0] => Stora gatan 34 [1] => Stora gatan [2] => 34 ) 

$address = "Stora gatan";
Array ( [0] => Stora gatan [1] => Stora gatan ) 

$address = "Stora 34 b";
Array ( [0] => Stora 34 b [1] => Stora [2] => 34 [3] => b ) 
1 голос
/ 25 ноября 2011

Как насчет этого:

  • создать столбец, содержащий адрес без пробелов: 'Storagatan34B'
  • удалить все пробелы из строки ввода пользователя перед поиском
  • использовать searchcolumn LIKE <input> + '%'

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

...