2013-06-04 49 views
0

我有一個數據庫中的地址包含街道名稱和街道號碼(和可能的添加像A,B,C等)。提取街道名稱和號碼

現在我需要將街道名稱,號碼和可能的情況下,添加到單獨的字段(與物流系統的鏈接)。

任何人都可以幫助我實現這個目標嗎?我與reg的經驗。表達式爲0

幾個可能的實施例可以是:

Stackstreet 14

Stackstreet 14A

堆棧溢出街道14

堆棧溢出街道141C

+2

您能否提供示例值? – BlitZ

+1

取決於這些值的差異,這可能非常困難。也許你可以通過谷歌地理編碼器發送數據,這會返回像這樣的結果? 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

對不起,但答覆r爲意思一樣有趣,因爲嚴重:

當輸入爲:

<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但是我認爲,如果一個好的註冊前,錯誤的機會將是微乎其微的。正如我在上面的評論中提到的那樣,我已經發現了一個正則表達式,它將數字中的名字分開,只是我仍然堅持在數字上添加。 –

相關問題