Разделить улицу, номер дома и добавление из адреса

#php #regex #preg-match

#php #регулярное выражение #preg-совпадение

Вопрос:

Я использую регулярное выражение для разделения голландской улицы, номера дома и добавления из адреса. Добавление должно быть необязательным.

 preg_match('/(?P<address>[^d] ) (?P<number>[d] )(?P<numberAdd>[^d] )/', $input, $matches)
  

Это работает только в том случае, если $input — это, например, улица 1A. Но не в том случае, если вводится только улица 1 (без добавления).

Итак, как я могу разделить адрес с добавлением в качестве необязательного? Добавление может не содержать чисел.

Комментарии:

1. Это потому [^d] , что означает один или несколько. Попробуйте (?P<numberAdd>[^d] )* вместо этого (это означает ноль или больше).

2. Или просто D* . Символьный класс не требуется.

Ответ №1:

Вы можете использовать одно регулярное выражение, которое соответствует многим. Это описано в этом Gist . Этот код также использует немецкие адреса.

 var re = /^(d*[wäöüßd '-.] )[,s] (d )s*([wäöüßd-/]*)$/i;

var adressen = [
  'Dorpstraat 2',
  'Dorpstr. 2',
  'Laan 1933 2',
  '18 Septemberplein 12',
  'Kerkstraat 42-f3',
  'Kerk straat 2b',
  '42nd street, 1337a',
  '1e Constantijn Huigensstraat 9b',
  'Maas-Waalweg 15',
  'De Dompelaar 1 B',
  'Kümmersbrucker Straße 2',
  'Friedrichstädter Straße 42-46',
  'Höhenstraße 5A',  
  'Saturnusstraat 60-75',
  'Saturnusstraat 60 - 75',
  '1, rue de l'eglise'
], match;

adressen.forEach(function(adres) {
  match = adres.match(re)
  if (match) {
    match.shift(); // remove element 0 (the entire match)
    //match is now always an array with length of 3
    console.log(match.join('|'))
  } else {
    console.log('No match: ' adres)
  }
})
  

Вот форматированный вывод

 Dorpstraat                   |    2 | 
Dorpstr.                     |    2 | 
Laan 1933                    |    2 | 
18 Septemberplein            |   12 | 
Kerkstraat                   |   42 | -f3 
Kerk straat                  |    2 | b 
42nd street                  | 1337 | a 
1e Constantijn Huigensstraat |    9 | b
Maas-Waalweg                 |   15 | 
De Dompelaar                 |    1 | B
Kümmersbrucker Straße        |    2 |
Friedrichstädter Straße      |   42 |-46
Höhenstraße                  |    5 | A
Saturnusstraat               |   60 | -75
Saturnusstraat 60 -          |   75 | //<-- problematic

No match: 1, rue de l'eglise
  

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

Комментарии:

1. вы нашли какие-либо улучшения в регулярных выражениях?

2. Я создал репозиторий на PHP по этому вопросу, см.: github.com/WebRTB/address-splitter . это все еще w.i.p. хотя запросы на извлечение более приветствуются.

Ответ №2:

Попробуйте с:

 preg_match('/(?P<address>D ) (?P<number>d )(?P<numberAdd>D*)/', $input, $matches)