0

テキスト ファイルには、次の通りの名前と番地があります。

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
....

このデータは、ローカル近隣の境界データ (つまり、コミュニティ内にある家) を表します。

ユーザーの入力 (「4918 David Lane」や「3000 Bergundy」などの形式) を受け取り、このリストを検索して、その家が境界内に存在するかどうかにかかわらず、はい/いいえの応答を返す PHP スクリプトを作成したいと考えています。

入力 (正規表現?) を解析してテキスト リストと比較する効率的な方法は何でしょうか?

助けてくれてありがとう!

4

5 に答える 5

1

テキストファイルからデータを解析する必要がないように、この情報をデータベースに保存することをお勧めします。正規表現は、範囲内の数値を見つけるためにも一般的に適用できないため、汎用言語もお勧めします。

しかし...正規表現でそれを実行したい場合(そしてなぜそれが良い考えではないのかを見てください)

ストリートユースの番号を検索するには

David Ln:(.*)

次に、数値を取得するには、

[^,]*
于 2012-06-13T21:30:07.740 に答える
1

ファイルを文字列にインポートするだけです。これが完了したら、ファイルの各行を配列 soArray(Line 1=> array(), Line 2=> array()などに分割します。これが完了したら、 を使用して分解できます:。後は、配列を検索するだけです。最速の方法ではありませんが、正規表現よりも高速な場合があります。

データベースの使用を真剣に検討するか、ファイルの状態を再考する必要があります。

于 2012-06-13T21:33:47.113 に答える
0

前述のように、データベースを使用して、通りの名前に関連する通りの番号を保存するのが理想的です。ただし、テキストファイルでこれを実装できる方法は、2D配列を作成することだと思います。通りの名前を最初の配列に格納し、有効な通りの番号をそれぞれの配列に格納します。

ループ内でファイルを 1 行ずつ解析します。通りの名前を解析して配列に格納し、ネストされたループを使用してすべての数値を解析し ( のような範囲内のものについては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++;
}
于 2012-06-13T21:52:53.873 に答える
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;
                    }

                }
            }
        }
于 2012-06-13T21:46:56.513 に答える
0

道路を ID とともに別のテーブルに保存し、番号を範囲または番号と道路 ID ごとに 1 つの行に別のテーブルに保存することをお勧めします。

例えば:

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
...

範囲がなく家番号が 1 つの行では、最小値と最大値の両方を同じ値に設定します。

txt ファイルを解析し、すべてのデータを db に保存するスクリプトを作成できます。これは、さまざまなパラメーターといくつかの挿入クエリを使用したいくつかのループとexplode()と同じくらい簡単なはずです。

次に、最初のクエリで通りの ID を取得します

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

その後、2 番目のクエリを実行して回答を得ると、その通りにそのような番地はありますか

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

[...] 内に実際の値を入力します。SQL インジェクションを防ぐためにそれらをエスケープすることを忘れないでください...

または、JOIN を使用して 1 つのクエリのみを実行することもできます。

また、指定された番地が浮動小数点数ではなく整数であることを確認する必要があります。

于 2015-12-07T18:01:03.863 に答える