0

PhoneNosテーブルに電話番号リストがあります

ID | PhoneNo
1 | +61 2 9666 8000 

この電話番号をContentテーブル (つまり、dess フィールド)で検索しようとします。

課題は実際には次のとおりです。

desc フィールドはテキストで、入力は次のようなものです。

ContentID | Desc    
1 | bla bla ... +61 (02) 9666 8000 ... bla bla
2 | bla bla ... +61-2-9666-8000 bla bla
3 | bla bla ... +61 2 96668000 bla bla
4 | bla bla ... +61296668000 00116129668000 bla bla

または、次のような余分な間隔から配置するものである可能性があります

5 | bla bla ... +61  (02) 9666   8000 ... bla bla
6 | bla bla ... +61-2 9662 0382 ... bla bla

これはオーストラリアの電話番号ですが、これも米国またはその他の国である可能性があるため、特定の国に限定されるわけではありません。

この電話は、この電話番号の前後に何のパターンもありません。だから何とでもなる。

この種のことを簡単に処理する方法はありますか?おそらく上記の各条件を構築できますが、より良い解決策があるかどうか疑問に思っています。

4

3 に答える 3

2

ユーザー入力を検索しやすい形式、つまり「+ [ x ]」に正規化するだけです。ユーザーが追加のスペースを入力した場合は、それらを削除します。必要に応じて国コードを追加します。先頭から 00 を削除し、+ に置き換えます。検索を容易にするために、電話番号を 3 つの列に分割することもできます。

于 2012-10-26T05:21:27.627 に答える
1

電話番号から特殊記号を削除して、数字の文字列として保存しないのはなぜですか?

+ は 00 を置き換えるため、考慮する必要があるのは + だけです。

したがって、基本的に、レコードには数字のみが含まれ、入力には数字のみが含まれます。データベースと入力の両方で、 + を何かに正規化してください。

私がすることは、+ の代わりに 00 を使用してそれらをすべて保存することです。これにより、00 を使用した検索入力が行われたときに、+ を使用した検索と同様に機能します。これが理にかなっていることを願っています。

于 2012-10-26T03:02:16.873 に答える
1

私の(非常に教育を受けていない)考えは、正規表現の置換を使用することです(こちらを参照)。基本的に、数字とプラス記号を除くコンテンツのすべてを削除し (まだぎこちなく感じますか? :))、同じ処理で制御文字列と比較します (\\+\d+基本的に)。これは、あなたの番号に一致する数字/文字の別のランダムな文字列によって誤検知が作成されないというかなり広い仮定になります (確率の観点からはややありそうにないと思いますが、常に可能性があります)。

私は、非常に非効率的で、洗練されておらず、間違っている可能性が高いと確信しているソリューションをいじっていましたが、先頭0の括弧内のケースを処理できないことに気付きました (これは他のパターンには存在しないように思われるため)。興味があればここで見つけることができますが、正規表現ソリューションが最も効率的な処理方法であると思います。

于 2012-10-26T05:10:17.097 に答える