2017-02-10 6 views
1

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

$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']); Но получить только название улицы ...

ответ

1

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

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

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

См regex demo и PHP demo:

$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+ несловообразующим CHARS
  • (\d+) - Группа 3: один или более цифр
  • $ - конец строки.

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

+0

@ Wiktor Stribiżew ... вы гений. Спасибо. Да регулярное выражение хорошее решение. –

+0

Я немного отредактировал регулярное выражение для ''/^ (. *) \ S (\ d +) (?: \ W + (\ d +))? $/''Теперь без ошибок ... Мне нужно использовать ваше необязательное предложение. –

Смежные вопросы