` * reference graph, which is built before that normalization happens. * * @param \DOMElement $element * @return string|null */ public static function getElementHref(\DOMElement $element) { if ($element->hasAttribute('href')) { return $element->getAttribute('href'); } if ($element->hasAttributeNS(self::XLINK_NAMESPACE_URI, 'href')) { return $element->getAttributeNS(self::XLINK_NAMESPACE_URI, 'href'); } foreach ($element->attributes as $attribute) { if (!$attribute instanceof \DOMAttr || strtolower($attribute->localName) !== 'href' ) { continue; } $prefix = strtolower((string)$attribute->prefix); if ($prefix === '' || $prefix === 'xlink') { return $attribute->value; } } return null; } /** * @param string $href * @return string|null */ public static function extractIdReferenceFromHref($href) { if (!is_string($href) || strpos($href, '#') !== 0) { return null; } return substr($href, 1); } /** * @param \DOMElement $needle * @param \DOMElement $haystack * @return bool */ public static function isElementContainedIn(\DOMElement $needle, \DOMElement $haystack) { if ($needle === $haystack) { return true; } foreach ($haystack->childNodes as $childNode) { if (!$childNode instanceof \DOMElement) { continue; } if (self::isElementContainedIn($needle, $childNode)) { return true; } } return false; } }