/** * 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(); }