/**
  * 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"));
 }
Example #4
0
 /**
  *
  * @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);
 }
Example #6
0
<?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;
 }