childNodes as $child) { if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) { if ($child->entities->length > 0) { return false; } } } if ($isRunningFpm === false) { libxml_disable_entity_loader($entityLoaderDisabled); } return $dom; } /** * Get a DomDocument instance or return false * * @static * @access public * @param string $input XML content * @return \DOMNDocument */ public static function getDomDocument($input) { if (empty($input)) { return false; } $dom = self::scanInput($input, function ($in) { $dom = new DomDocument; $dom->loadXml($in, LIBXML_NONET); return $dom; }); // The document is empty, there is probably some parsing errors if ($dom && $dom->childNodes->length === 0) { return false; } return $dom; } /** * Load HTML document by using a DomDocument instance or return false on failure * * @static * @access public * @param string $input XML content * @return \DOMDocument */ public static function getHtmlDocument($input) { if (empty($input)) { return new DomDocument; } if (version_compare(PHP_VERSION, '5.4.0', '>=')) { $callback = function ($in) { $dom = new DomDocument; $dom->loadHTML($in, LIBXML_NONET); return $dom; }; } else { $callback = function ($in) { $dom = new DomDocument; $dom->loadHTML($in); return $dom; }; } return self::scanInput($input, $callback); } /** * Convert a HTML document to XML * * @static * @access public * @param string $html HTML document * @return string */ public static function HtmlToXml($html) { $dom = self::getHtmlDocument(''.$html); return $dom->saveXML($dom->getElementsByTagName('body')->item(0)); } /** * Get XML parser errors * * @static * @access public * @return string */ public static function getErrors() { $errors = array(); foreach(libxml_get_errors() as $error) { $errors[] = sprintf('XML error: %s (Line: %d - Column: %d - Code: %d)', $error->message, $error->line, $error->column, $error->code ); } return implode(', ', $errors); } /** * Get the encoding from a xml tag * * @static * @access public * @param string $data Input data * @return string */ public static function getEncodingFromXmlTag($data) { $encoding = ''; if (strpos($data, '')); $data = str_replace("'", '"', $data); $p1 = strpos($data, 'encoding='); $p2 = strpos($data, '"', $p1 + 10); if ($p1 !== false && $p2 !== false) { $encoding = substr($data, $p1 + 10, $p2 - $p1 - 10); $encoding = strtolower($encoding); } } return $encoding; } /** * Get the charset from a meta tag * * @static * @access public * @param string $data Input data * @return string */ public static function getEncodingFromMetaTag($data) { $encoding = ''; if (preg_match('/;]+)/i', $data, $match) === 1) { $encoding = strtolower($match[1]); } return $encoding; } /** * Get xml:lang value * * @static * @access public * @param string $xml XML string * @return string Language */ public static function getXmlLang($xml) { $dom = self::getDomDocument($xml); if ($dom === false) { return ''; } $xpath = new DOMXPath($dom); return $xpath->evaluate('string(//@xml:lang[1])') ?: ''; } /** * Get a value from a XML namespace * * @static * @access public * @param \SimpleXMLElement $xml XML element * @param array $namespaces XML namespaces * @param string $property XML tag name * @param string $attribute XML attribute name * @return string */ public static function getNamespaceValue(SimpleXMLElement $xml, array $namespaces, $property, $attribute = '') { foreach ($namespaces as $name => $url) { $namespace = $xml->children($namespaces[$name]); if (isset($namespace->$property) && $namespace->$property->count() > 0) { if ($attribute) { foreach ($namespace->$property->attributes() as $xml_attribute => $xml_value) { if ($xml_attribute === $attribute && $xml_value) { return (string) $xml_value; } } } return (string) $namespace->$property; } } return ''; } }