如何从电话号码正确存储和查找areacode

时间:2013-09-22 02:55:39

标签: php mysql phone-number

如何在数据库中存储areacodes(npa-nxx)以便快速查找?

这是交易:我有一个包含电话号码的变量,我需要在数据库中查找附加到该电话号码的城市。

问题是,不同的国家有不同的格式。

Canada/USA: +19055551234 (+1 > Country, 905 > Area Code, 555 > City Code)
France: +33512345678 (+33 > Country, 5 > Areacode, 1 > City, Other numbers > Subscriber number)

等(基于维基百科的信息)

我创建了一个名为'npanxx'的表,其中包含每个附加区号,城市代码和城市的列表(具有国家/地区的ID和省/州ID):

CountryId, RegionId, PrimaryCity, npa, nxx, fnpanxx
1          11        Acton Vale   450  236  +1450236

我正在考虑以下程序:

Get all country codes from sql to php array
Go through each entry and check if there's a match from the beginning of the phone number
When (If there's) a match is found
  Remove the beginning of the phone number
  Get all npa-nxx that belong to that contry and put them in a php array
  Go through each value of the array to find a matching beginning
  When (If there's) a match is found
    Remove the beginning of the phone number
    Store data in different variables like: $country = 'Canada'; $city = 'Acton Vale'...
    etc, etc.

第一个错误(我认为):对很多数据库请求(npanxx表包含加拿大仅一个省的3000条记录) 第二个错误:我很确定没有必要通过每个npa-nxx代码

另一个问题:如果电话号码是法国电话号码,则此程序无效。

并且...如果有一个条目,让我们说336和另一个3364,它可能会给出错误的结果。

你知道我怎么能解决这个问题吗? (我不要求任何代码,我不想为我做这项工作,但我想要一些线索)

这是一个为加拿大多发性硬化症协会捐赠的人事项目,并且非常希望完成该项目:)

2 个答案:

答案 0 :(得分:1)

我认为可能会有一些注册或其他模式匹配,以便在搜索方面减少选择。只是一些基本的方式或“猜测”可能性,而不是搜索所有这些。

答案 1 :(得分:0)

这是我用PHP编写的一个小脚本,用于从area-codes.com实时返回NPA / NXX作为JSON对象。

它返回一些非常有用的数据。它只适用于NANP,所以它不能很好地识别国际电话。为此,我建议制作一份包含所有国际国家代码的表格以及在国际上拨打这些代码的适当方法。

此外,网络交换运营商需要一个国际拨号代码(如美国的011,或一般的手机+),以确定该号码是否为国际,然后采取上述步骤,找出你想去。您可以将此约束添加到输入字段中并使用它完成。

如果你想在北美编号计划中获取NPA / NXX信息,那么这个脚本应该非常有帮助。

撇开,area-codes.com在其免费服务中计算在线查询,我在网站上没有发现任何暗示此代码违反该政策的内容。但是,可以对此代码进行重组,以便从其他提供程序中收集数据,

 <?php

    // Small script to return and format all data from the NPA/NXX info site www.area-codes.com
    // Returns a JSON object.

    error_reporting(E_NONE);

    $npa = $_GET['npa'];
    $nxx = $_GET['nxx'];

    function parseInput($input) {

        $v = new DOMDocument();

        $v->formatOutput = true;
        $v->preserveWhiteSpace = false;

        $v->loadHTML($input);

        $list = $v->getElementsByTagName("td");

        $e = false;
        $dataOut = array();
        $p = "";

        foreach($list as $objNode) {
            if (!$e) {
                $p = $objNode->nodeValue;

                $p = strtolower($p);
                $p = preg_replace("%[+ .:()\/_-]%", "", $p);
                $p = str_replace("\xc2\xa0", "", $p);
                $p = trim($p);
            }
            else {
                if ($p != "") {
                    $d = trim($objNode->nodeValue);
                    if ($d != "") $dataOut[$p] = $d;
                }
                $p = "";
            }

            $e = !$e;  
        }

        return $dataOut;

    }

    function getNPANXX($npa, $nxx) {

        $url = "www.area-codes.com/exchange/exchange.asp?npa=$npa&nxx=$nxx";
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_VERBOSE, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
        curl_setopt($ch, CURLOPT_URL, $url);

        $response = curl_exec($ch);
        curl_close($ch);

        $i = strpos($response, "<h3>AreaCode/Prefix $npa-$nxx Details</h3>");
        $i = strpos($response, "<table width=\"100%\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\">", $i);
        $e = strpos($response, "</table>", $i);

        $scan = substr($response, $i, ($e-$i) + 8);
        return parseInput($scan);

    }

    $result = getNPANXX($npa, $nxx);

    if (!isset($result['npaareacode'])) {
        $result = array("error" => "invalid");
    }

    echo json_encode($result);
    die;

?>

对于查询 npanxx.php?npa = 202&amp; nxx = 520 ,JSON输出如下:

{
"npaareacode":"202",
"nxxusetype":"WIRELESS",
"nxxprefix":"520",
"nxxintroversion":"11\/16\/2007",
"city":"WASHINGTON",
"state":"DC",
"latitude":"38.901",
"county":"DISTRICT OF COLUMBIA",
"longitude":"-77.0315",
"countypopulation":"0",
"lata":"236",
"zipcode":"20005",
"zipcodecount":"0",
"ratecenter":"WSHNGTNZN1",
"zipcodefreq":"0",
"fips":"11001",
"ocn":"6664",
"observesdst":"Unknown",
"cbsacode":"47900",
"timezone":"Eastern (GMT -05:00)",
"cbsaname":"Washington-Arlington-Alexandria, DC-VA-MD-WV",
"carriercompany":"SPRINT SPECTRUM L.P."
}

对于您的示例 npanxx.php?npa = 450&amp; nxx = 236 ,返回的数据有点受限,因为它的加拿大和加拿大不提供像美联航这样的所有FIPS和运营商数据各州确实如此,但返回的数据仍然非常有用:

{
"npaareacode":"450",
"nxxusetype":"WIRELESS",
"nxxprefix":"236",
"nxxintroversion":"2002-08-04",
"city":"ACTON VALE",
"state":"QC",
"latitude":"45.6523",
"longitude":"-72.5671",
"countypopulation":"51400",
"lata":"850",
"zipcodecount":"0",
"zipcodefreq":"-1",
"observesdst":"Unknown",
"timezone":"Eastern (GMT -05:00)"
}