2013-06-04 4 views
0

У меня есть база данных, в которой адрес содержит название улицы и номер улицы (и возможное добавление, например, A, B, C и т. Д.).Извлечение названия и номера улицы

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

Может ли кто-нибудь помочь мне достичь этого? Мой опыт работы с рег. выражения 0.

Несколько возможных примеров может быть:

Stackstreet 14

Stackstreet 14а улица

Stack Overflow 14

Stack Overflow улица 141C

+2

Не могли бы вы представить пример значений? – BlitZ

+1

В зависимости от того, насколько значения меняются, это может быть очень тяжело. Возможно, вы можете отправить данные через Google Geocoder, который возвращает результаты, подобные этому? https://developers.google.com/maps/documentation/geocoding/#XML –

+0

Является ли это базой данных MySQL? –

ответ

1

Попробуйте:

$str = 'Stackstreet 14a'; 
$matches= explode(" ", $str); 
print_r($matches); 

После этого вы можете проверить каждый элемент в $ сопоставлено, чтобы обнаружить, если элемент содержит цифру. если элемент содержит цифру, то его номер остаётся его частью названия улицы. Например:

$matches= Array ([0] => Stackstreet [1] => 14a) 

"Stackstreet" - не содержат цифры ==> название улицы.

"14a" - содержит цифру ==> номер.

Это как обнаружить это строка содержит цифры:

$myString="14a"; 
if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString)) 
{ 
    echo 'Contains at least one letter and one number'; 
} 

Другой способ:

По b01:

Попробуйте это как посмотреть, если он работает для вас :

$subjects = array("street 12", "street12", "street 12a", "street12a"); 
foreach($subjects as $subject) 
{ 
    if (preg_match('/([^\d]+)\s?(.+)/i', $subject, $result)) 
    { 
     var_dump($result); 
    } 
} 
die_r($result ); 

Единственная часть вам нужно это:

// Find a match and store it in $result. 
if (preg_match('/([^\d]+)\s?(.+)/i', $subject, $result)) 
{ 
    // $result[1] will have the steet name 
    $streetName = $result[1]; 
    // and $result[2] is the number part. 
    $streetNumber = $result[2]; 
} 

Кредитb01.

+0

Это возвращает только номера улиц, а не имена. Я уже нашел '/([^\d]+)\s?(.+)/i'. Это отделило название улицы от номера, но не число из необязательного добавления. –

+0

@Mike de Vrind Я изменил свой ответ, чтобы использовать функцию explode() для разделения по пространству; –

+0

@ Mike de Vrind Вам это помогло? –

-1

Извините, но answe г понимается так же, как смешно, как серьезно:

Где вход:

<input type=text name=streetAndNumberAndExtension /> 

Вам действительно нужно сделать:

<input type=text name=street /> 
<input type=text name=number /> 
<input type=text name=extension/> 

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

+2

Вы совершенно правы. То, как это должно быть сделано. Но я работаю над существующим интернет-магазином. Я не могу просто начать изменять базу данных и все связанные с ней коды и формы. –

+0

Уверен, что вы можете :) ... (Или это закрытый источник?) ... В любом случае, все, что у вас есть, - это, в лучшем случае, хакерское решение. И вам придется принять несколько неудач. –

+0

Хорошо, хорошо ... Я могу: p Но клиент не будет платить за всю эту дополнительную работу: p Но я думаю, что с хорошей рег быстр, вероятность ошибки будет минимальной. Как я уже упоминал в вышеприведенном комментарии, я уже нашел регулярное выражение, которое разделяет имя из числа, только я все еще придерживаюсь добавления на число. –

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