/** * Gets the expected cost category of a short number (however, nothing is implied about its * validity). If the country calling code is unique to a region, this method behaves exactly the * same as {@link #getExpectedCostForRegion(String, String)}. However, if the country calling * code is shared by multiple regions, then it returns the highest cost in the sequence * PREMIUM_RATE, UNKNOWN_COST, STANDARD_RATE, TOLL_FREE. The reason for the position of * UNKNOWN_COST in this order is that if a number is UNKNOWN_COST in one region but STANDARD_RATE * or TOLL_FREE in another, its expected cost cannot be estimated as one of the latter since it * might be a PREMIUM_RATE number. * * For example, if a number is STANDARD_RATE in the US, but TOLL_FREE in Canada, the expected cost * returned by this method will be STANDARD_RATE, since the NANPA countries share the same country * calling code. * * Note: If the region from which the number is dialed is known, it is highly preferable to call * {@link #getExpectedCostForRegion(String, String)} instead. * * @param $number PhoneNumber the short number for which we want to know the expected cost category * @return int the highest expected cost category of the short number in the region(s) with the given * country calling code */ public function getExpectedCost(PhoneNumber $number) { $regionCodes = $this->phoneUtil->getRegionCodesForCountryCode($number->getCountryCode()); if (count($regionCodes) == 0) { return ShortNumberCost::UNKNOWN_COST; } $shortNumber = $this->phoneUtil->getNationalSignificantNumber($number); if (count($regionCodes) == 1) { return $this->getExpectedCostForRegion($shortNumber, $regionCodes[0]); } $cost = ShortNumberCost::TOLL_FREE; foreach ($regionCodes as $regionCode) { $costForRegion = $this->getExpectedCostForRegion($shortNumber, $regionCode); switch ($costForRegion) { case ShortNumberCost::PREMIUM_RATE: return ShortNumberCost::PREMIUM_RATE; case ShortNumberCost::UNKNOWN_COST: $cost = ShortNumberCost::UNKNOWN_COST; break; case ShortNumberCost::STANDARD_RATE: if ($cost != ShortNumberCost::UNKNOWN_COST) { $cost = ShortNumberCost::STANDARD_RATE; } break; case ShortNumberCost::TOLL_FREE: // Do nothing break; } } return $cost; }
/** * Gets a {@link PhoneNumberUtil} instance to carry out international phone number formatting, * parsing, or validation. The instance is loaded with phone number metadata for a number of most * commonly used regions. * * <p>The {@link PhoneNumberUtil} is implemented as a singleton. Therefore, calling getInstance * multiple times will only result in one instance being created. * * @param string $baseFileLocation * @param array|null $countryCallingCodeToRegionCodeMap * @return PhoneNumberUtil instance */ public static function getInstance($baseFileLocation = self::META_DATA_FILE_PREFIX, array $countryCallingCodeToRegionCodeMap = NULL) { if ($countryCallingCodeToRegionCodeMap === NULL) { $countryCallingCodeToRegionCodeMap = CountryCodeToRegionCodeMap::$countryCodeToRegionCodeMap; } if (self::$instance === NULL) { self::$instance = new PhoneNumberUtil(); self::$instance->countryCallingCodeToRegionCodeMap = $countryCallingCodeToRegionCodeMap; self::$instance->init($baseFileLocation); self::initCapturingExtnDigits(); self::initExtnPatterns(); self::initAsciiDigitMappings(); self::initExtnPattern(); self::$PLUS_CHARS_PATTERN = "[" . self::PLUS_CHARS . "]+"; self::$SEPARATOR_PATTERN = "[" . self::VALID_PUNCTUATION . "]+"; self::$CAPTURING_DIGIT_PATTERN = "(" . self::DIGITS . ")"; self::$VALID_START_CHAR_PATTERN = "[" . self::PLUS_CHARS . self::DIGITS . "]"; self::$ALPHA_PHONE_MAPPINGS = self::$ALPHA_MAPPINGS + self::$asciiDigitMappings; self::$DIALLABLE_CHAR_MAPPINGS = self::$asciiDigitMappings; self::$DIALLABLE_CHAR_MAPPINGS[self::PLUS_SIGN] = self::PLUS_SIGN; self::$DIALLABLE_CHAR_MAPPINGS['*'] = '*'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS = array(); // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings. foreach (self::$ALPHA_MAPPINGS as $c => $value) { self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[strtolower($c)] = $c; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[$c] = $c; } self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS += self::$asciiDigitMappings; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["-"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["-"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["‐"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["‑"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["‒"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["–"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["—"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["―"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["−"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["/"] = "/"; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["/"] = "/"; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[" "] = " "; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[" "] = " "; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[""] = " "; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["."] = "."; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["."] = "."; } return self::$instance; }
public function testIsAlphaNumber() { $this->assertTrue($this->phoneUtil->isAlphaNumber("1800 six-flags")); $this->assertTrue($this->phoneUtil->isAlphaNumber("1800 six-flags ext. 1234")); $this->assertTrue($this->phoneUtil->isAlphaNumber("+800 six-flags")); $this->assertFalse($this->phoneUtil->isAlphaNumber("1800 123-1234")); $this->assertFalse($this->phoneUtil->isAlphaNumber("1800 123-1234 extension: 1234")); $this->assertFalse($this->phoneUtil->isAlphaNumber("+800 1234-1234")); }
/** * * @param string $phoneNumber * @param string $regionCode */ public function __construct($phoneNumber = '', $regionCode = 'US') { $this->_phoneUtil = PhoneNumberUtil::getInstance(); $this->setRegionCode($regionCode); if (!empty($phoneNumber)) { $this->setPhoneNumber($phoneNumber); } else { $this->_numberProto = null; } }
/** * @param string $number * @param string $regionCode * @param bool $allowPrefixMatch * @return bool */ private function matchesEmergencyNumberHelper($number, $regionCode, $allowPrefixMatch) { $number = PhoneNumberUtil::extractPossibleNumber($number); $matcher = new Matcher(PhoneNumberUtil::$PLUS_CHARS_PATTERN, $number); if ($matcher->lookingAt()) { // Returns false if the number starts with a plus sign. We don't believe dialing the country // code before emergency numbers (e.g. +1911) works, but later, if that proves to work, we can // add additional logic here to handle it. return false; } $metadata = $this->getMetadataForRegion($regionCode); if ($metadata === null || !$metadata->hasEmergency()) { return false; } $normalizedNumber = PhoneNumberUtil::normalizeDigitsOnly($number); $emergencyDesc = $metadata->getEmergency(); $allowPrefixMatchForRegion = $allowPrefixMatch && !in_array($regionCode, self::$regionsWhereEmergencyNumbersMustBeExact); return $this->matcherAPI->matchesNationalNumber($normalizedNumber, $emergencyDesc, $allowPrefixMatchForRegion); }
<?php namespace libphonenumber; require_once dirname(__FILE__) . '/PhoneNumberUtil.php'; require_once dirname(__FILE__) . '/CountryCodeToRegionCodeMap.php'; require_once dirname(__FILE__) . '/PhoneNumber.php'; require_once dirname(__FILE__) . '/PhoneMetadata.php'; require_once dirname(__FILE__) . '/PhoneNumberDesc.php'; require_once dirname(__FILE__) . '/NumberFormat.php'; require_once dirname(__FILE__) . '/Matcher.php'; require_once dirname(__FILE__) . '/CountryCodeSource.php'; require_once dirname(__FILE__) . '/PhoneNumberType.php'; require_once dirname(__FILE__) . '/PhoneNumberFormat.php'; $swissNumberStr = "044 668 18 00"; $phoneUtil = PhoneNumberUtil::getInstance(); try { $swissNumberProto = $phoneUtil->parse($swissNumberStr, "CH"); var_dump($swissNumberProto); } catch (NumberParseException $e) { echo $e; } $isValid = $phoneUtil->isValidNumber($swissNumberProto); //return true var_dump($isValid); // Produces "+41446681800" echo $phoneUtil->format($swissNumberProto, PhoneNumberFormat::E164) . PHP_EOL;
/** * Gets a {@link PhoneNumberUtil} instance to carry out international phone number formatting, * parsing, or validation. The instance is loaded with phone number metadata for a number of most * commonly used regions. * * <p>The {@link PhoneNumberUtil} is implemented as a singleton. Therefore, calling getInstance * multiple times will only result in one instance being created. * * @param string $baseFileLocation * @param array|null $countryCallingCodeToRegionCodeMap * @return PhoneNumberUtil instance */ public static function getInstance($baseFileLocation = self::META_DATA_FILE_PREFIX, array $countryCallingCodeToRegionCodeMap = null) { if ($countryCallingCodeToRegionCodeMap === null) { $countryCallingCodeToRegionCodeMap = CountryCodeToRegionCodeMap::$countryCodeToRegionCodeMap; } if (self::$instance === null) { self::$instance = new PhoneNumberUtil(); self::$instance->countryCallingCodeToRegionCodeMap = $countryCallingCodeToRegionCodeMap; self::$instance->init($baseFileLocation); self::initCapturingExtnDigits(); self::initExtnPatterns(); self::initAsciiDigitMappings(); self::initExtnPattern(); self::$PLUS_CHARS_PATTERN = "[" . self::PLUS_CHARS . "]+"; self::$SEPARATOR_PATTERN = "[" . self::VALID_PUNCTUATION . "]+"; self::$CAPTURING_DIGIT_PATTERN = "(" . self::DIGITS . ")"; self::$VALID_START_CHAR_PATTERN = "[" . self::PLUS_CHARS . self::DIGITS . "]"; self::$ALPHA_PHONE_MAPPINGS = self::$ALPHA_MAPPINGS + self::$asciiDigitMappings; self::$DIALLABLE_CHAR_MAPPINGS = self::$asciiDigitMappings; self::$DIALLABLE_CHAR_MAPPINGS[self::PLUS_SIGN] = self::PLUS_SIGN; self::$DIALLABLE_CHAR_MAPPINGS['*'] = '*'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS = array(); // Put (lower letter -> upper letter) and (upper letter -> upper letter) mappings. foreach (self::$ALPHA_MAPPINGS as $c => $value) { self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[strtolower($c)] = $c; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[$c] = $c; } self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS += self::$asciiDigitMappings; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["-"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["-"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["‐"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["‑"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["‒"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["–"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["—"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["―"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["−"] = '-'; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["/"] = "/"; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["/"] = "/"; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[" "] = " "; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[" "] = " "; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS[""] = " "; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["."] = "."; self::$ALL_PLUS_NUMBER_GROUPING_SYMBOLS["."] = "."; self::$MIN_LENGTH_PHONE_NUMBER_PATTERN = "[" . self::DIGITS . "]{" . self::MIN_LENGTH_FOR_NSN . "}"; self::$VALID_PHONE_NUMBER = "[" . self::PLUS_CHARS . "]*(?:[" . self::VALID_PUNCTUATION . self::STAR_SIGN . "]*[" . self::DIGITS . "]){3,}[" . self::VALID_PUNCTUATION . self::STAR_SIGN . self::VALID_ALPHA . self::DIGITS . "]*"; self::$VALID_PHONE_NUMBER_PATTERN = "%^" . self::$MIN_LENGTH_PHONE_NUMBER_PATTERN . "\$|^" . self::$VALID_PHONE_NUMBER . "(?:" . self::$EXTN_PATTERNS_FOR_PARSING . ")?%" . self::REGEX_FLAGS; self::$UNWANTED_END_CHAR_PATTERN = "[^" . self::DIGITS . self::VALID_ALPHA . "#]+\$"; self::$MOBILE_TOKEN_MAPPINGS = array(); self::$MOBILE_TOKEN_MAPPINGS['52'] = "1"; self::$MOBILE_TOKEN_MAPPINGS['54'] = "9"; self::loadNumericCharacters(); } return self::$instance; }