libphonenumber javascript 到 PHP 的转换
libphonenumber javascript to PHP conversion
我正在使用 libphonenumber 的这个 PHP 端口,因为另一个需要 mbstring,而我的 PHP 版本没有安装。
https://github.com/davideme/libphonenumber-for-PHP
现在,我在下面的 $country
值中传递什么并不重要。我总是得到例外:
Missing or invalid default region
我到底做错了什么?
我正在移植一些 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)])
不确定为什么要这样做。 REGION_CODE_FOR_NON_GEO_ENTITY
设置为“001”,因此它从 supportedRegions 数组中删除美国条目。
我最终修复了它,方法是从另一个 PHP 端口中的 init
函数中获取代码并将其放入此端口中。我没有注意到,但是这个也使用了 mbstring 函数 mb_substr 但我不需要它并将其修改为仅使用 substr.
现在一切正常。
可能是因为 $phoneUtil->getRegionCodeForCountryCode()
方法没有返回合适的区域而被抛出。
您输入的是哪个国家代码?
这个国家代码是在你的国家代码到区域列表中,还是this file中的默认国家代码?
SO 在为低代表用户添加评论方面存在愚蠢的限制,因此这是一个尚未完成的答案....
未在 getRegionCodeForCountryCode()
中抛出异常。它被下一个调用抛出:parse($cleanphone, $region)
这并不是说问题不在 getRegionCodeForCountryCode()
中,您可以通过在两次调用之间回应 $region
的值来缩小范围。回显 $cleanphone
也很有帮助,这样您就知道您要进行的调用是什么。
我最终修复了它,方法是从另一个 PHP 端口中的 init 函数中获取代码并将其放入这个端口中。我没有注意到,但是这个也使用了 mbstring 函数 mb_substr 但我不需要它并将其修改为仅使用 substr.
现在一切正常。
我正在使用 libphonenumber 的这个 PHP 端口,因为另一个需要 mbstring,而我的 PHP 版本没有安装。 https://github.com/davideme/libphonenumber-for-PHP
现在,我在下面的 $country
值中传递什么并不重要。我总是得到例外:
Missing or invalid default region
我到底做错了什么?
我正在移植一些 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)])
不确定为什么要这样做。 REGION_CODE_FOR_NON_GEO_ENTITY
设置为“001”,因此它从 supportedRegions 数组中删除美国条目。
我最终修复了它,方法是从另一个 PHP 端口中的 init
函数中获取代码并将其放入此端口中。我没有注意到,但是这个也使用了 mbstring 函数 mb_substr 但我不需要它并将其修改为仅使用 substr.
现在一切正常。
可能是因为 $phoneUtil->getRegionCodeForCountryCode()
方法没有返回合适的区域而被抛出。
您输入的是哪个国家代码?
这个国家代码是在你的国家代码到区域列表中,还是this file中的默认国家代码?
SO 在为低代表用户添加评论方面存在愚蠢的限制,因此这是一个尚未完成的答案....
未在 getRegionCodeForCountryCode()
中抛出异常。它被下一个调用抛出:parse($cleanphone, $region)
这并不是说问题不在 getRegionCodeForCountryCode()
中,您可以通过在两次调用之间回应 $region
的值来缩小范围。回显 $cleanphone
也很有帮助,这样您就知道您要进行的调用是什么。
我最终修复了它,方法是从另一个 PHP 端口中的 init 函数中获取代码并将其放入这个端口中。我没有注意到,但是这个也使用了 mbstring 函数 mb_substr 但我不需要它并将其修改为仅使用 substr.
现在一切正常。