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

Мне нужно разделить адрес: Main Str. 202-52 на street=Main Str. house No.=202 room No.=52 Я пытался использовать это:

$data['address'] = "Main Str. 202-52";
$data['street'] = explode(" ", $data['address']);
$data['building'] = explode("-", $data['street'][0]);

Работает при названии улицы одним словом. Как разделить адрес, где в названии улицы есть несколько слов. Я пробовал $data['street'] = preg_split('/[0-9]/', $data['address']);, но получил только название улицы ...


person K. B.    schedule 10.02.2017    source источник


Ответы (1)


Вы можете использовать регулярное выражение, например

/^(.*)\s(\d+)\W+(\d+)$/

если вам нужны все до последнего пробела в группе 1, следующие цифры в группе 2 и последние цифры в группе 3. \W+ соответствует 1+ символам, кроме символов слов, поэтому он соответствует - и более. Если у вас там -, просто используйте дефис вместо \W+.

См. демонстрацию регулярных выражений и Демонстрация PHP:

$s = "Main Str. 202-52";
if (preg_match('~^(.*)\s(\d+)\W+(\d+)$~', $s, $m)) {
    echo $m[1] . "\n"; // Main Str. 
    echo $m[2] . "\n"; // 202
    echo $m[3];        // 52
}

Детали рисунка:

  • ^ - начало строки
  • (.*) - Группа 1 захватывает любые символы 0+, кроме символов разрыва строки, как можно больше до последнего ....
  • \s - пробел, за которым следует ...
  • (\d+) - Группа 2: одна или несколько цифр
  • \W+ - 1+ символов без слов
  • (\d+) - Группа 3: одна или несколько цифр
  • $ - конец строки.

Также обратите внимание, что в случае, если последняя часть может быть необязательной, оберните \W+(\d+) необязательной группой захвата (например, (?:...)?, (?:\W+(\d+))?).

person Wiktor Stribiżew    schedule 10.02.2017
comment
@ Wiktor Stribiew ... ты гений. Спасибо. Да регулярное выражение хорошее решение. - person K. B.; 11.02.2017
comment
Я немного отредактировал регулярное выражение в '/^(.*)\s(\d+)(?:\W+(\d+))?$/' сейчас без ошибок ... мне нужно использовать ваше дополнительное предложение. - person K. B.; 12.02.2017