Преобразование libphonenumber javascript в PHP

Я использую этот PHP-порт libphonenumber, потому что для другого требуется mbstring, который не установлен в моей версии PHP. https://github.com/davideme/libphonenumber-for-PHP

Теперь не имеет значения, что я передаю в значении $country ниже. Я всегда получаю исключение:
Missing or invalid default region

Что я здесь делаю не так?

Я переношу некоторый код javascript для использования библиотек PHP в плагине ExpressionEngine.

Вот 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, которую я пытаюсь преобразовать, которая использует порт javascript libphonenumber:

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;
}

Что очень странно, так это то, что США И ZZ НЕ находятся в массиве поддерживаемых регионов.

Я узнал, что удаляет его из поддерживаемых регионов... Этот вызов:

unset($this->supportedRegions[array_search(self::REGION_CODE_FOR_NON_GEO_ENTITY, $this->supportedRegions)])

Не уверен, почему это делается. Для REGION_CODE_FOR_NON_GEO_ENTITY установлено значение «001», поэтому запись США удаляется из массива поддерживаемых регионов.

В конце концов я исправил это, взяв код из функции init в другом порту PHP и поместив его в этот. Я не заметил, но в этом также использовалась функция mbstring mb_substr, но она мне не нужна, и я изменил ее, чтобы использовать только substr.

Все работает сейчас.


person MB34    schedule 30.06.2015    source источник


Ответы (3)


Предположительно выбрасывается, потому что метод $phoneUtil->getRegionCodeForCountryCode() не возвращает подходящую область.

Код какой страны вы передаете?

Этот код страны указан в вашем списке кодов стран и регионов или используется по умолчанию в этот файл?

person Luke Cousins    schedule 30.06.2015
comment
Проходит в США и находится в файле карты регионов. - person MB34; 01.07.2015
comment
Пробовал пройти 1 с теми же результатами. - person MB34; 01.07.2015

SO имеет глупое ограничение на добавление комментариев для пользователей с низким числом повторений, так что это пока неполный ответ....

Исключение НЕ выдается в getRegionCodeForCountryCode(). Он вызывается следующим вызовом: parse($cleanphone, $region)

Это не значит, что проблема не в getRegionCodeForCountryCode(), и вы можете сузить ее, повторяя значение $region между двумя вызовами. Повторение $cleanphone также полезно, чтобы вы знали, что вы собираетесь делать в этом вызове.

person messy    schedule 30.06.2015
comment
Он вызывается в функции parseHelper (строка 1148); Я изменил сообщение об исключении, чтобы отразить параметр $defaultRegion, и оно показало это. - person MB34; 01.07.2015
comment
Но опять же, может случиться так, что checkRegionForParsing не работает, или вызов isValidRegionCode также может завершиться ошибкой. Но я передаю действительный код региона. Добавим немного логирования в код, чтобы узнать. - person MB34; 01.07.2015

В конце концов я исправил это, взяв код из функции инициализации в другом порту PHP и поместив его в этот. Я не заметил, но в этом также использовалась функция mbstring mb_substr, но она мне не нужна, и я изменил ее, чтобы использовать только substr.

Все работает сейчас.

person MB34    schedule 01.07.2015