public function numberToE164($number = '', $countryCode = null) { if ($number == '') { $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($countryCode); return $phoneNumber; } // extract the country code from the number if possible list($countryCode, $number) = $this->detectCountryCode($countryCode, $number); //cleanup the non-numeric chars $number = preg_replace('/[^0-9]+/', '', $number); // easier to read than 65 / 60 / etc $regionCode = $this->getRegionCodeFromCountryCode($countryCode); $regionFormatter = $this->getRegionFormatter($regionCode); if (!$regionFormatter) { $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($countryCode); $phoneNumber->setSubscriberNumber($number); return $phoneNumber; } //extract area code $phoneNumber = $regionFormatter->extractNationalDestinationCode($number, $countryCode); if (!$phoneNumber) { $phoneNumber = new PhoneNumber(); $phoneNumber->setSubscriberNumber($number); } $phoneNumber->setCountryCode($countryCode); return $phoneNumber; }
/** * @dataProvider provideFormatByDigitCount **/ public function testFormatByDigitCount($expected, $E164) { $this->initRegionFormatters($this->formatter); $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($E164['countryCode']); $phoneNumber->setSubscriberNumber($E164['subscriberNumber']); $phoneNumber->setNationalDestinationCode($E164['nationalDestinationCode']); $phoneNumber->setNationalDestinationCodeInternational($E164['nationalDestinationCodeInternational']); $actual = $this->formatter->formatByDigitCount($phoneNumber); $this->assertEquals($expected, $actual); }
public function numberToE164($number = '', $countryCode = null) { if ($number == '') { $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($countryCode); return $phoneNumber; } // extract the country code from the number if possible // get all possibilities $possibleCountryCodes = $this->getAllPossibleCountryCodes($countryCode, $number); //the original match order matters also //if the weights are the same foreach ($possibleCountryCodes as $k => $numberCode) { $possibleCountryCodes[$k]['order'] = $k; } $foundValidNumbers = array(); $foundInvalidNumbers = array(); //re-order the country codes based on the suplied weights uasort($possibleCountryCodes, array($this, 'comparePossibleNumbers')); $possibleCountryCodes = array_values($possibleCountryCodes); if (empty($possibleCountryCodes)) { //return default number $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($countryCode); $phoneNumber->setSubscriberNumber($number); return $phoneNumber; } foreach ($possibleCountryCodes as $k => $numberCode) { $countryCode = $numberCode['countryCode']; $subscriberNumber = $numberCode['subscriberNumber']; // cleanup the non-numeric chars $subscriberNumber = preg_replace('/[^0-9]+/', '', $subscriberNumber); // easier to read than 65 / 60 / etc $regionCode = $this->getRegionCodeFromCountryCode($countryCode); $regionFormatter = $this->getRegionFormatter($regionCode); if (!$regionFormatter) { // since we have no specific algorithm for this country // assume it's correct $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($countryCode); $phoneNumber->setIsValid(true); $phoneNumber->setSubscriberNumber($subscriberNumber); $this->addListNumber($foundValidNumbers, $phoneNumber); continue; } //extract area code $phoneNumber = $regionFormatter->extractNationalDestinationCode($subscriberNumber, $countryCode); if (!$phoneNumber) { $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode($countryCode); $phoneNumber->setSubscriberNumber($subscriberNumber); $this->addListNumber($foundInvalidNumbers, $phoneNumber); } else { $phoneNumber->setCountryCode($countryCode); $phoneNumber->setIsValid(true); $this->addListNumber($foundValidNumbers, $phoneNumber); } } foreach ($foundValidNumbers as $countryCode => $numbers) { foreach ($numbers as $phoneNumber) { return $phoneNumber; } } foreach ($foundInvalidNumbers as $countryCode => $numbers) { foreach ($numbers as $phoneNumber) { return $phoneNumber; } } }