正規表現によるアドレス検索のフォーマット

私は、アドレスのデータベースを検索するアプリケーションを持っています。ページの訪問者は彼または彼女のアドレスを入力し、彼らが接続されているかどうかをアプリが通知します。

検索する必要のある情報が含まれているデータベースの関連部分は次のとおりです。

streetname      "Stora gatan"
streetnumber    "34"
streetletter    "B"
address         "Stora gatan 34B"

このデータベースは私の顧客から提供されています。ご覧のとおり、きれいにフォーマットされています。訪問者が探している膨大なデータの大部分は次のとおりです。

"Stora gatan"
"Stora gatan 34"
"Stora gatan 34b"
"Stora gatan 34 b"

これらは、私が現在興味を持っている only 形式です。これはスウェーデン語のアプリケーションであり、これはスウェーデンでのアドレスの書式設定/入力方法です。上記のいずれかのワイルドバージョン(例えば、ユーザーが "34 Storgatan B"を検索する必要がある場合は、何も一致しないでしょう。

アプリケーションフォームに1つではなく3つの検索フィールドが必要なので、インデータは1つの文字列内にあることも非常に望ましくありません。

あなたが見ることができるように、上記の検索用語の1つは、住所を入力する正当な方法であるにもかかわらず失敗します。住所の番号と文字の間にスペースがあるものです。

だから私はすべての入力された検索をキャッチし、うまくいけばそれらを修正するために、この正規表現を書いた:

if (preg_match("/^(.*?)\s*(\d*?)\s*([A-Za-z]*?)$/", $address, $m)){
    $streetname = uc_words($m[1]);
    $streetnumber = trim($m[2]);
    $streetletter = strtoupper($m[3]);
    $search = trim($streetname . SPACE . $streetnumber . $streetletter);
}

残念ながら、これは私が望んでいたように実際には機能しません。結果として得られる$ mは、上の各例で次のようになります。

違う:

Array
(
    [0] => Stora gatan
    [1] => Stora
    [2] => 
    [3] => gatan
)

正しい:

Array
(
    [0] => Stora gatan 34
    [1] => Stora gatan
    [2] => 34
    [3] => 
)

正しい:

Array
(
    [0] => Stora gatan 34b
    [1] => Stora gatan
    [2] => 34
    [3] => b
)

皆さんはキャッチオール式のポインタを持っていますか?あるいは、正規表現の前にキャッチすることをお勧めしますか?すべての入力をいただければ幸いです。

ありがとう!

1
これはほぼ不可能です。人々は非常にさまざまな方法で住所を書いています(ところで、ここノルウェー)。私はむしろ、ユーザーが入力する複数のフィールドに行きたいと思っています。Streetadress、numberなど。ユーザーが住所の後にコンマを入力するとどうなりますか?あなたの正規表現をクラッシュさせないでしょうか?
追加された 著者 OptimusCrime,

2 答え

これを試してください(もっとも美しい正規表現ではありませんが、動作します):

$address = "Stora gatan 34 b";
preg_match("/([a-zA-Z ]+) ?([0-9]+)? ?([a-zA-Z]+)?/", $address, $m);

print_r($m);

結果:

$address = "Stora gatan 34 b";
Array ( [0] => Stora gatan 34 b [1] => Stora gatan [2] => 34 [3] => b ) 

$address = "Stora gatan 34b";
Array ( [0] => Stora gatan 34b [1] => Stora gatan [2] => 34 [3] => b ) 

$address = "Stora gatan 34";
Array ( [0] => Stora gatan 34 [1] => Stora gatan [2] => 34 ) 

$address = "Stora gatan";
Array ( [0] => Stora gatan [1] => Stora gatan ) 

$address = "Stora 34 b";
Array ( [0] => Stora 34 b [1] => Stora [2] => 34 [3] => b ) 
2
追加された
感謝万円!
追加された 著者 Sandman,
その正規表現には何も問題はありません...本当にそれをもっと小さくすることはできますか?
追加された 著者 Jaco Van Niekerk,

これはどう:

  • create a column that contains the address without spaces: 'Storagatan34B'
  • remove all spaces from the user input string before you search
  • use searchcolumn LIKE <input> + '%'

もちろん、スペースの他に、無視したい他の文字を削除することもできます。検索列と入力に同じ置換方式を使用していることを確認してください。

1
追加された
また、良い提案ですが、それは大きなデータベースであり、私は他の選択肢がなければそれをそのまま保つことを望んでいます。
追加された 著者 Sandman,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com