/** * Extracts the available formats from the provided DOM element. If it does not contain any * nationalPrefixFormattingRule, the one passed-in is retained. * @param PhoneMetadata $metadata * @param string $regionCode * @param \DOMElement $element * @param string $nationalPrefix * @param string $nationalPrefixFormattingRule */ private static function loadAvailableFormats(PhoneMetadata $metadata, $regionCode, \DOMElement $element, $nationalPrefix, $nationalPrefixFormattingRule) { $carrierCodeFormattingRule = ""; if ($element->hasAttribute(self::CARRIER_CODE_FORMATTING_RULE)) { $carrierCodeFormattingRule = self::getDomesticCarrierCodeFormattingRuleFromElement($element, $nationalPrefix); } $numberFormatElements = $element->getElementsByTagName(self::NUMBER_FORMAT); $hasExplicitIntlFormatDefined = false; $numOfFormatElements = $numberFormatElements->length; if ($numOfFormatElements > 0) { for ($i = 0; $i < $numOfFormatElements; $i++) { $numberFormatElement = $numberFormatElements->item($i); $format = new NumberFormat(); if ($numberFormatElement->hasAttribute(self::NATIONAL_PREFIX_FORMATTING_RULE)) { $format->setNationalPrefixFormattingRule(self::getNationalPrefixFormattingRuleFromElement($numberFormatElement, $nationalPrefix)); } else { $format->setNationalPrefixFormattingRule($nationalPrefixFormattingRule); } if ($numberFormatElement->hasAttribute(self::CARRIER_CODE_FORMATTING_RULE)) { $format->setDomesticCarrierCodeFormattingRule(self::getDomesticCarrierCodeFormattingRuleFromElement($numberFormatElement, $nationalPrefix)); } else { $format->setDomesticCarrierCodeFormattingRule($carrierCodeFormattingRule); } self::loadNationalFormat($metadata, $numberFormatElement, $format); $metadata->addNumberFormat($format); if (self::loadInternationalFormat($metadata, $numberFormatElement, $format)) { $hasExplicitIntlFormatDefined = true; } } // Only a small number of regions need to specify the intlFormats in the xml. For the majority // of countries the intlNumberFormat metadata is an exact copy of the national NumberFormat // metadata. To minimize the size of the metadata file, we only keep intlNumberFormats that // actually differ in some way to the national formats. if (!$hasExplicitIntlFormatDefined) { $metadata->clearIntlNumberFormat(); } } }