Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libphonenumber javascript到PHP的转换_Javascript_Php_Libphonenumber - Fatal编程技术网

libphonenumber javascript到PHP的转换

libphonenumber javascript到PHP的转换,javascript,php,libphonenumber,Javascript,Php,Libphonenumber,我使用libphonenumber的这个PHP端口,因为另一个需要mbstring,我的PHP版本没有安装它。 现在,我在下面的$country值中传递什么并不重要。我总是得到一个例外: 缺少或无效的默认区域 我到底做错了什么 我正在移植一些javascript代码,以便在ExpressionEngine插件中使用PHP库 以下是PHP代码: function getNumberParts($country, $phone) { try { $cleanphon

我使用libphonenumber的这个PHP端口,因为另一个需要mbstring,我的PHP版本没有安装它。

现在,我在下面的
$country
值中传递什么并不重要。我总是得到一个例外:
缺少或无效的默认区域

我到底做错了什么

我正在移植一些javascript代码,以便在ExpressionEngine插件中使用PHP库

以下是PHP代码:

function getNumberParts($country, $phone) {
    try {
            $cleanphone  = $this->cleanPhone($phone);
            $phoneUtil   = PhoneNumberUtil::getInstance();
            $region      = $phoneUtil->getRegionCodeForCountryCode($country);
            $number      = $phoneUtil->parse($cleanphone, $region);

            $e164        = $phoneUtil->format($number, 0);
            $num         = $phoneUtil->parseAndKeepRawInput($e164, "ZZ");
            $ctry        = $phoneUtil->getRegionCodeForNumber($num);
            $NSN         = $phoneUtil->getNationalSignificantNumber($num);
            $intl        = str_replace("tel:+", "", $phoneUtil->format($num, 3));
            $output      = array("Country"=>"", "CountryCode"=>"", "AreaCode"=>"", "Number"=>"", "Intl"=>"", "FullNumber"=>"");
            $areaCodeLen = $phoneUtil->getLengthOfNationalDestinationCode($num);
            $areaCode    = '';
            if ($areaCodeLen > 0) {
                $subscriberNumber = substr($NSN, $areaCodeLen);
                $areaCode = substr($NSN, 0, $areaCodeLen);
            } else {
                $subscriberNumber = $NSN;
            }
            $output["Country"] = $ctry;
            $output["CountryCode"] = $cc;
            $output["AreaCode"] = $areaCode;
            $output["Number"] = $subscriberNumber;
            $output["Intl"] = $intl;
            $output["FullNumber"] = $output["CountryCode"] . '-' + $output["AreaCode"] . '-' + $output["Number"];
            return $output;
    } catch (NumberParseException $e) {
        $this->formatNumber($phone);
    }    
}


function formatNumber($a, $b) {
    try {
        $b = cleanPhone($b);
        $c = PhoneNumberUtil::getInstance();
        $e = $c->parseAndKeepRawInput($b, $a)
        $f = $c->format($e, PhoneNumberFormat::RFC3966);
        return json_encode($f);
    } catch (NumberParseException $e) {
        return $b
    }
}
这是我试图转换的javascript函数,它利用libphonenumber的javascript端口:

function getNumberParts(country, phone) {
    try {
        phone = cleanPhone(phone);
        var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance();
        var cc = phoneUtil.getCountryCodeForRegion(country);
        var number = phoneUtil.parseAndKeepRawInput(phone, country)
        var e164 = phoneUtil.format(number, 0);
        var num = phoneUtil.parseAndKeepRawInput(e164, "ZZ");
        var ctry = phoneUtil.getRegionCodeForNumber(num);
        var NSN = phoneUtil.getNationalSignificantNumber(num);
        intl = phoneUtil.format(num, 3)
        intl = intl.replace("tel:+", "");
        var output = { "Country": "", "CountryCode": "", "AreaCode": "", "Number": "", "Intl":"", "FullNumber": "" };
        var areaCodeLen = phoneUtil.getLengthOfNationalDestinationCode(num);
        var areaCode = '';
        intlNumber = "";
        if (areaCodeLen > 0) {
            subscriberNumber = NSN.substring(areaCodeLen);
            areaCode = NSN.substring(0, areaCodeLen);
        } else {
            subscriberNumber = NSN;
        }
        output.Country = ctry;
        output.CountryCode = number.getCountryCode();
        output.AreaCode = areaCode;
        output.Number = subscriberNumber;
        output.Intl = intl;
        output.FullNumber = number.getCountryCode() + '-' + areaCode + '-' + subscriberNumber;
        return output;
    } catch (l) {
        return formatNumber(country, phone);
    }
}
即使使用示例代码也会引发相同的异常:

$phoneUtil   = PhoneNumberUtil::getInstance();
try {
    $NumberProto = $phoneUtil->parse($cleanphone, "US");
    var_dump($NumberProto);
} catch (NumberParseException $e) {
    echo $e;
}
非常奇怪的是,US和ZZ不在supportedRegions数组中

我发现了从supportedRegions中删除它的原因。。。 此电话:

unset($this->supportedRegions[array_search(self::REGION_CODE_FOR_NON_GEO_ENTITY, $this->supportedRegions)])
不知道为什么要这样做。非GEO实体的
区域\u code\u设置为“001”,因此它正在从supportedRegions数组中删除US条目


最后,我通过从另一个PHP端口的
init
函数中获取代码并将其放入这个端口来修复它。我没有注意到,但这一个也使用了mbstring函数mb_substr,但我不需要它,并将其修改为只使用substr


现在一切正常。

可能是因为
$phoneUtil->getRegionDeforCountryCode()
方法没有返回合适的区域而引发的

您要传递的国家代码是什么


这是您所在国家/地区代码列表中的国家/地区代码,还是您所在国家/地区列表中的默认国家/地区代码?

因此在为低代表性用户添加评论方面存在愚蠢的限制,因此这是一个尚未完成的答案

getRegionDeforCountryCode()
中未引发异常。下一个调用将抛出它:
parse($cleanphone,$region)


这并不是说问题不在
getRegionDeforCountryCode()
中,您可以通过在两个调用之间回显
$region
的值来缩小问题的范围。回显
$cleanphone
也很有帮助,这样您就可以知道调用的内容了。

我最终通过从另一个PHP端口的init函数中获取代码并将其放入这个端口来修复它。我没有注意到,但这一个也使用了mbstring函数mb_substr,但我不需要它,并将其修改为只使用substr


现在一切正常。

传入“US”,它位于区域映射文件中。尝试传递1,结果相同。它被抛出到
parseHelper
函数中(第1148行);我修改了异常消息以回显
$defaultRegion
参数,并显示了它。但是,可能是
checkRegionForParsing
失败,或者调用
isValidRegionCode
也可能失败。但我正在传递一个有效的地区代码。将在代码中添加一些日志来查找。