#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)