/**
  * Processes a phone number description element from the XML file and returns it as a
  * PhoneNumberDesc. If the description element is a fixed line or mobile number, the general
  * description will be used to fill in the whole element if necessary, or any components that are
  * missing. For all other types, the general description will only be used to fill in missing
  * components if the type has a partial definition. For example, if no "tollFree" element exists,
  * we assume there are no toll free numbers for that locale, and return a phone number description
  * with "NA" for both the national and possible number patterns.
  *
  * @param PhoneNumberDesc $generalDesc generic phone number description that will be used to fill in missing
  * parts of the description
  * @param \DOMElement $countryElement XML element representing all the country information
  * @param string $numberType name of the number type, corresponding to the appropriate tag in the XML
  * file with information about that type
  * @return PhoneNumberDesc complete description of that phone number type
  */
 private static function processPhoneNumberDescElement(PhoneNumberDesc $generalDesc, \DOMElement $countryElement, $numberType)
 {
     $phoneNumberDescList = $countryElement->getElementsByTagName($numberType);
     $numberDesc = new PhoneNumberDesc();
     if ($phoneNumberDescList->length == 0 && !self::isValidNumberType($numberType)) {
         $numberDesc->setNationalNumberPattern("NA");
         $numberDesc->setPossibleNumberPattern("NA");
         return $numberDesc;
     }
     $numberDesc->mergeFrom($generalDesc);
     if ($phoneNumberDescList->length > 0) {
         $element = $phoneNumberDescList->item(0);
         $possiblePattern = $element->getElementsByTagName(self::POSSIBLE_NUMBER_PATTERN);
         if ($possiblePattern->length > 0) {
             $numberDesc->setPossibleNumberPattern($possiblePattern->item(0)->firstChild->nodeValue);
         }
         $validPattern = $element->getElementsByTagName(self::NATIONAL_NUMBER_PATTERN);
         if ($validPattern->length > 0) {
             $numberDesc->setNationalNumberPattern($validPattern->item(0)->firstChild->nodeValue);
         }
         if (!self::$liteBuild) {
             $exampleNumber = $element->getElementsByTagName(self::EXAMPLE_NUMBER);
             if ($exampleNumber->length > 0) {
                 $numberDesc->setExampleNumber($exampleNumber->item(0)->firstChild->nodeValue);
             }
         }
     }
     return $numberDesc;
 }
 public function testMaybeStripNationalPrefix()
 {
     $metadata = new PhoneMetadata();
     $metadata->setNationalPrefixForParsing("34");
     $phoneNumberDesc = new PhoneNumberDesc();
     $phoneNumberDesc->setNationalNumberPattern("\\d{4,8}");
     $metadata->setGeneralDesc($phoneNumberDesc);
     $numberToStrip = "34356778";
     $strippedNumber = "356778";
     $carrierCode = null;
     $this->assertTrue($this->phoneUtil->maybeStripNationalPrefixAndCarrierCode($numberToStrip, $metadata, $carrierCode));
     $this->assertEquals($strippedNumber, $numberToStrip, "Should have had national prefix stripped.");
     // Retry stripping - now the number should not start with the national prefix, so no more
     // stripping should occur.
     $carrierCode = null;
     $this->assertFalse($this->phoneUtil->maybeStripNationalPrefixAndCarrierCode($numberToStrip, $metadata, $carrierCode));
     $this->assertEquals($strippedNumber, $numberToStrip, "Should have had no change - no national prefix present.");
     // Some countries have no national prefix. Repeat test with none specified.
     $metadata->setNationalPrefixForParsing("");
     $carrierCode = null;
     $this->assertFalse($this->phoneUtil->maybeStripNationalPrefixAndCarrierCode($numberToStrip, $metadata, $carrierCode));
     $this->assertEquals($strippedNumber, $numberToStrip, "Should not strip anything with empty national prefix.");
     // If the resultant number doesn't match the national rule, it shouldn't be stripped.
     $metadata->setNationalPrefixForParsing("3");
     $numberToStrip = "3123";
     $strippedNumber = "3123";
     $carrierCode = null;
     $this->assertFalse($this->phoneUtil->maybeStripNationalPrefixAndCarrierCode($numberToStrip, $metadata, $carrierCode));
     $this->assertEquals($strippedNumber, $numberToStrip, "Should have had no change - after stripping, it wouldn't have matched the national rule.");
     // Test extracting carrier selection code.
     $metadata->setNationalPrefixForParsing("0(81)?");
     $numberToStrip = "08122123456";
     $strippedNumber = "22123456";
     $carrierCode = "";
     $this->assertTrue($this->phoneUtil->maybeStripNationalPrefixAndCarrierCode($numberToStrip, $metadata, $carrierCode));
     $this->assertEquals("81", $carrierCode);
     $this->assertEquals($strippedNumber, $numberToStrip, "Should have had national prefix and carrier code stripped.");
     // If there was a transform rule, check it was applied.
     $metadata->setNationalPrefixTransformRule("5\${1}5");
     // Note that a capturing group is present here.
     $metadata->setNationalPrefixForParsing("0(\\d{2})");
     $numberToStrip = "031123";
     $transformedNumber = "5315123";
     $carrierCode = null;
     $this->assertTrue($this->phoneUtil->maybeStripNationalPrefixAndCarrierCode($numberToStrip, $metadata, $carrierCode));
     $this->assertEquals($transformedNumber, $numberToStrip, "Should transform the 031 to a 5315.");
 }
 public function isNumberPossibleForDesc($nationalNumber, PhoneNumberDesc $numberDesc)
 {
     $possibleNumberPatternMatcher = new Matcher($numberDesc->getPossibleNumberPattern(), $nationalNumber);
     return $possibleNumberPatternMatcher->matches();
 }