2013-07-15 70 views
1

我想將一個字符串分成var street和streetnr。我怎樣才能做到這一點與PHP?我怎樣才能從一個字符串中劃分streetnr和街道?

的數據是這樣的:

Bakerstreet 5 
Wild Street 5 a 
Best Street 5a 
Simplestreet 

我有沒有街道號碼和街道的信件......我怎樣才能做到這一點?

所以這條街道應該始終像

VAR街道= Bakerstreet,野生街,百思街,Simplestreet

VAR streetnr應始終= 5,5,5α

我的想法是在每一個空白之後爆炸字符串「」......然後我倒轉數組並查看第一個元素是否只是一個字母。如果是這樣,我把它放在街道上。然後我檢查下一個元素。如果有隻是數字,我把它改成streetnr ...等等

+2

所以,你得到一個解決方案之前,你真的需要定義標準如何確定「街道」部分與「街道號碼」。你能用現實世界的術語解釋要求嗎? –

+0

好吧,我編輯了這個問題,爲此! – Susanne92

+0

@ Susanne92 - 他們總是會以這種格式?你不會有街道號碼的第一行,然後是街道名稱? – andrewsi

回答

2

我已經用它作爲我的PHP培訓練習。當我站在正則表達式的一個巨大的風扇,我想這樣做沒有EM和具有以下想出了:

<?php 
$addr = array("Bakerstreet 5", 
"Wild Street 5 a", 
"Best Street 5a", 
"Simplestreet", 
"Won't Work 47a Suite 18b", 
"1st Street 10b ", 
"Route 66 12a " 
); 


echo "<h1>Address-Parsing</h1><ol>"; 
foreach ($addr as $ad) 
{ 
    $no=""; // Number 
    $st=""; // Street 
    $GotNo = false; 
    $r = strrev(trim($ad)); 
    echo "<li>ad=$ad"; 
    do { 
    while ($r{0}=="0") {// special handling for leading "0"s (in reverted string) which are ignored by sscanf... 
     if (!$GotNo) $no = "0" . $no; 
     else $st = "0" . $st; 
     $r = substr($r,1); 
    } 
    $d = sscanf($r,"%d"); // get number 
    $s = sscanf($r,"%c"); // get string 
    if (is_null($d[0]) && !$GotNo) { 
     // no matching number and have not matched no yet - so this must be string following the nr 
     $no = strrev($s[0]) . $no; 
     $r = substr($r,strlen($s[0])); // remove match 
    } elseif (!$GotNo) { 
     $no = strrev($d[0]) . $no; 
     $GotNo = true; 
     $r = substr($r,strlen($d[0])); // remove match 
    } else {// we already have a number, so any text must be streetname 
     $st = strrev($r) . $st; 
     $r=""; 
    } 
    if ($r !== trim($r)) {$st = " " . $st; $r = trim($r);} 
    } while (0<strlen($r)); 
    $st = trim($st); 
    if (empty($st)) {// might happen when no number was found... 
    $st=$no; 
    $no=""; 
    } 
    echo "|st=$st|no=$no|</li>"; 
} 
echo "</ol>"; 

?> 
+1

這些情況會發生什麼? '1st Street 10b'' Route 66 12a' –

+0

以下是一些無可置疑的PHP培訓建議:對* everything *使用有意義的變量名稱,這不是簡單的循環計數器。如果櫃檯有特殊的含義,即使在那裏。否則,同事會恨你,你將無法理解你自己的代碼,地獄之門將打開! –

+0

@STTLCU:你會得到| st​​ = 1st Street | no = 10b | (我不得不修復一個bug,謝謝你!)和| st = Route 66 | no = 12a | – MBaas

0

您可以匹配使用以下正則表達式:

preg_match('/^(.+?)(?:\s+(\d.*))?$/', $street, $matches); 
$street = $matches[1]; 
if (count($matches) == 3) 
    $streetnr = $matches[2]; 
1

使用正則表達式

preg_match('~^\s*(.*)\s+([0-9]+\s*[a-zA-Z]{0,1})\s*$~', $street, $match); 

的preg_match回報如果街道格式正確,並且$ match是包含[1] =街道名稱[2] = streetnr的數組,則爲true。

相關問題