2012-06-13 71 views
0

我有一個文本文件,下面的街道名稱和門牌號碼:PHP:根據文本文件檢查用戶輸入?

Albert Dr: 4116-4230, 4510, 4513-4516 
Bergundy Pl: 1300, 1340-1450 
David Ln: 3400, 4918, 4928, 4825 
Garfield Av: 5000, 5002, 5004, 5006, 8619-8627, 9104-9113 
.... 

這個數據代表了當地的居委會(是社區裏面即,什麼房子)的邊界數據。

我想製作一個PHP腳本,它將接受用戶的輸入(以「4918 David Lane」或「3000 Bergundy」之類的形式)搜索此列表,並返回yes/no響應,無論該房屋是否存在在邊界內。

什麼是解析輸入(正則表達式?)並將其與文本列表進行比較的有效方法?

感謝您的幫助!

+3

[你嘗試過什麼?](http://whathaveyoutried.com/) – sczizzo

+0

的grep,sed的,AWK浮現在腦海中。 – hafichuk

+0

任何你不能使用數據庫的原因,即使它是sqlite? – hafichuk

回答

1

最好將這些信息存儲在數據庫中,這樣就不必從文本文件中解析出數據。正則表達式通常也不適用於查找範圍內的數字,因此建議使用通用語言。

但是...如果你想用正則表達式來做到這一點(,看看爲什麼這不是一個好主意)

來查找號碼街道使用

David Ln:(.*) 

爲了再拿到號碼使用

[^,]* 
1

你可以簡單地將文件導入到一個字符串。完成此操作後,將數組中的每行文件拆分爲Array(Line 1=> array(), Line 2=> array()等。完成此操作後,可以使用:進行爆炸。之後,你只需要在數組中搜索。不是最快的方法,但它可能比正則表達式更快。

你應該真誠地考慮使用數據庫或重新考慮你的文件是如何。

0

嘗試類似這樣的方法,將您的街道名稱放入test.txt中。現在您可以獲取文本文件中的詳細信息,只需將其與您在表單中提交的值進行比較即可。

$filename = 'test.txt'; 
     if(file_exists($filename)) { 
      if($handle = fopen($filename, 'r')) { 
       $name = array(); 
       while(($file = fgets($handle)) !==FALSE) { 
        preg_match('#(.*):(.*)#', $file, $match); 
        $array = explode(',', $match[2]); 
        foreach($array as $val) { 
         $name[$match[1]][] = $val; 
        } 

       } 
      } 
     } 
0

如前所述,使用數據庫存儲與街道名稱相關的街道號將是理想的。我認爲你可以用你的文本文件實現這一點,但是要創建一個2D數組;將街道名稱存儲在第一個陣列中,並將有效的街道號碼存儲在它們各自的陣列中。

在循環中逐行解析文件。解析街道名稱並存儲在數組中,然後使用嵌套循環來解析所有的數字(對於1414-1420等範圍內的數字,您可以使用額外的循環來獲取範圍中的每個數字)並構建下一個數組在最初的街道名稱數組元素中。當你有2D數組時,你可以做一個簡單的嵌套循環來檢查它是否匹配。

我會盡量爲你製作一些僞代碼..

僞代碼:

$addresses = array(); 
$counter = 0; 
$line = file->readline 
while(!file->eof) 
{ 
    $addresses[$counter] = parse_street_name($line); 
    $numbers_array = parse_street_numbers($line); 
    foreach($numbers_array as $num) 
    $addresses[$counter][] = $num; 

    $line = file->readline 
    $counter++; 
} 
+0

對不起,如果僞代碼很差。我只是希望它能幫助你實現實現的想法,因爲它看起來像你正在尋找的實現。 *這不是有效的代碼。* –

0

它的更好,如果您存儲街道在一個單獨的表的ID,並在單獨的表中存儲號碼,每一列都範圍或數量和街道的ID。

例如:

streets: 

ID, street 
----------- 
1, Albert Dr 
2, Bergundy Pl 
3, David Ln 
4, Garfield Av 
... 

houses: 

street_id, house_min, house_max 
----------------- 
1, 4116, 4230 
1, 4510, 4510 
1, 4513, 4516 
2, 1300, 1300 
2, 1340, 1450 
... 

在行,如果沒有範圍,但一個門牌號碼,你倆的最小值和最大值設置爲同一值。

您可以編寫一個腳本,將解析您的txt文件,所有數據保存到數據庫。這應該像幾個循環一樣簡單,並使用不同的參數和一些插入查詢進行爆炸()。

然後用第一個查詢你的街道編號

SELECT id FROM streets WHERE street LIKE '%[street name]%' 

後您運行第二個查詢,並得到回答,是否有對街頭這樣的門牌號碼

SELECT COUNT(*) 
FROM houses 
WHERE street_id = [street_id] 
    AND [house_num] BETWEEN house_min AND house_max 

內[...]你把真正的價值,不要忘了逃脫他們防止SQL注入......

或者你甚至可以使用JOIN只運行一個查詢。你

還應該確保你給出的門牌號碼是整數,而不是浮動。