private function parse() { if ($this->phoneNumberProto) { // from phoneNumberProto $this->country_code = $this->phoneNumberProto->getCountryCode(); $this->country_code_plus_sign = "+" . $this->country_code; $this->national_number = $this->phoneNumberProto->getNationalNumber(); $this->extension = $this->phoneNumberProto->getExtension(); $this->country_code_source = $this->phoneNumberProto->getCountryCodeSource(); if (isset($this->countryCodeSourcesText[$this->country_code_source])) { $this->country_code_source_text = $this->countryCodeSourcesText[$this->country_code_source]; } $this->raw_input = $this->phoneNumberProto->getRawInput(); $this->preferred_domestic_carrier_code = $this->phoneNumberProto->getPreferredDomesticCarrierCode(); // from validation $this->is_possible_number = $this->phoneUtil->isPossibleNumber($this->phoneNumberProto); $this->is_valid_number = $this->phoneUtil->isValidNumber($this->phoneNumberProto); $this->region_code_for_number = $this->phoneUtil->getRegionCodeForNumber($this->phoneNumberProto); $this->number_type = $this->phoneUtil->getNumberType($this->phoneNumberProto); $this->number_type_text = $this->phoneUtil->getNumberType($this->phoneNumberProto); if (isset($this->phoneNumberTypesText[$this->number_type])) { $this->number_type_text = $this->phoneNumberTypesText[$this->number_type]; } else { $this->number_type_text = "OTHER"; } $this->is_mobile_number = in_array($this->number_type, [PhoneNumberType::FIXED_LINE_OR_MOBILE, PhoneNumberType::MOBILE]); // from formatting $this->format_e164 = $this->phoneUtil->format($this->phoneNumberProto, PhoneNumberFormat::E164); $this->format_international = $this->phoneUtil->format($this->phoneNumberProto, PhoneNumberFormat::INTERNATIONAL); $this->format_national = $this->phoneUtil->format($this->phoneNumberProto, PhoneNumberFormat::NATIONAL); $this->format_rfc3966 = $this->phoneUtil->format($this->phoneNumberProto, PhoneNumberFormat::RFC3966); // from additional $phoneNumberOfflineGeocoder = PhoneNumberOfflineGeocoder::getInstance(); $this->description = $phoneNumberOfflineGeocoder->getDescriptionForNumber($this->phoneNumberProto, 'en'); $phoneNumberToCarrierMapper = PhoneNumberToCarrierMapper::getInstance(); $this->carrier_name = $phoneNumberToCarrierMapper->getNameForNumber($this->phoneNumberProto, 'en'); $phoneNumberToTimeZonesMapper = PhoneNumberToTimeZonesMapper::getInstance(); $this->timezones = $phoneNumberToTimeZonesMapper->getTimeZonesForNumber($this->phoneNumberProto); } }
/** * Formats a phone number for out-of-country dialing purposes. * * Note that in this version, if the number was entered originally using alpha characters and * this version of the number is stored in raw_input, this representation of the number will be * used rather than the digit representation. Grouping information, as specified by characters * such as "-" and " ", will be retained. * * <p><b>Caveats:</b></p> * <ul> * <li> This will not produce good results if the country calling code is both present in the raw * input _and_ is the start of the national number. This is not a problem in the regions * which typically use alpha numbers. * <li> This will also not produce good results if the raw input has any grouping information * within the first three digits of the national number, and if the function needs to strip * preceding digits/words in the raw input before these digits. Normally people group the * first three digits together so this is not a huge problem - and will be fixed if it * proves to be so. * </ul> * * @param PhoneNumber $number the phone number that needs to be formatted * @param String $regionCallingFrom the region where the call is being placed * @return String the formatted phone number */ public function formatOutOfCountryKeepingAlphaChars(PhoneNumber $number, $regionCallingFrom) { $rawInput = $number->getRawInput(); // If there is no raw input, then we can't keep alpha characters because there aren't any. // In this case, we return formatOutOfCountryCallingNumber. if (mb_strlen($rawInput) == 0) { return $this->formatOutOfCountryCallingNumber($number, $regionCallingFrom); } $countryCode = $number->getCountryCode(); if (!$this->hasValidCountryCallingCode($countryCode)) { return $rawInput; } // Strip any prefix such as country calling code, IDD, that was present. We do this by comparing // the number in raw_input with the parsed number. // To do this, first we normalize punctuation. We retain number grouping symbols such as " " // only. $rawInput = $this->normalizeHelper($rawInput, self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS, true); // Now we trim everything before the first three digits in the parsed number. We choose three // because all valid alpha numbers have 3 digits at the start - if it does not, then we don't // trim anything at all. Similarly, if the national number was less than three digits, we don't // trim anything at all. $nationalNumber = $this->getNationalSignificantNumber($number); if (mb_strlen($nationalNumber) > 3) { $firstNationalNumberDigit = strpos($rawInput, substr($nationalNumber, 0, 3)); if ($firstNationalNumberDigit !== false) { $rawInput = substr($rawInput, $firstNationalNumberDigit); } } $metadataForRegionCallingFrom = $this->getMetadataForRegion($regionCallingFrom); if ($countryCode == self::NANPA_COUNTRY_CODE) { if ($this->isNANPACountry($regionCallingFrom)) { return $countryCode . " " . $rawInput; } } else { if ($metadataForRegionCallingFrom !== null && $countryCode == $this->getCountryCodeForValidRegion($regionCallingFrom)) { $formattingPattern = $this->chooseFormattingPatternForNumber($metadataForRegionCallingFrom->numberFormats(), $nationalNumber); if ($formattingPattern === null) { // If no pattern above is matched, we format the original input. return $rawInput; } $newFormat = new NumberFormat(); $newFormat->mergeFrom($formattingPattern); // The first group is the first group of digits that the user wrote together. $newFormat->setPattern("(\\d+)(.*)"); // Here we just concatenate them back together after the national prefix has been fixed. $newFormat->setFormat("\$1\$2"); // Now we format using this pattern instead of the default pattern, but with the national // prefix prefixed if necessary. // This will not work in the cases where the pattern (and not the leading digits) decide // whether a national prefix needs to be used, since we have overridden the pattern to match // anything, but that is not the case in the metadata to date. return $this->formatNsnUsingPattern($rawInput, $newFormat, PhoneNumberFormat::NATIONAL); } } $internationalPrefixForFormatting = ""; // If an unsupported region-calling-from is entered, or a country with multiple international // prefixes, the international format of the number is returned, unless there is a preferred // international prefix. if ($metadataForRegionCallingFrom !== null) { $internationalPrefix = $metadataForRegionCallingFrom->getInternationalPrefix(); $uniqueInternationalPrefixMatcher = new Matcher(self::UNIQUE_INTERNATIONAL_PREFIX, $internationalPrefix); $internationalPrefixForFormatting = $uniqueInternationalPrefixMatcher->matches() ? $internationalPrefix : $metadataForRegionCallingFrom->getPreferredInternationalPrefix(); } $formattedNumber = $rawInput; $regionCode = $this->getRegionCodeForCountryCode($countryCode); // Metadata cannot be null because the country calling code is valid. $metadataForRegion = $this->getMetadataForRegionOrCallingCode($countryCode, $regionCode); $this->maybeAppendFormattedExtension($number, $metadataForRegion, PhoneNumberFormat::INTERNATIONAL, $formattedNumber); if (mb_strlen($internationalPrefixForFormatting) > 0) { $formattedNumber = $internationalPrefixForFormatting . " " . $countryCode . " " . $formattedNumber; } else { // Invalid region entered as country-calling-from (so no metadata was found for it) or the // region chosen has multiple international dialling prefixes. $this->prefixNumberWithCountryCallingCode($countryCode, PhoneNumberFormat::INTERNATIONAL, $formattedNumber); } return $formattedNumber; }