*/ class UriResolver implements UriResolverInterface { /** * Parses a URI into five main components * * @param string $uri * * @return array */ public function parse($uri) { preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); $components = array(); if (5 < count($match)) { $components = array( 'scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5] ); } if (7 < count($match)) { $components['query'] = $match[7]; } if (9 < count($match)) { $components['fragment'] = $match[9]; } return $components; } /** * Builds a URI based on n array with the main components * * @param array $components * * @return string */ public function generate(array $components) { $uri = $components['scheme'] . '://' . $components['authority'] . $components['path']; if (array_key_exists('query', $components) && strlen($components['query'])) { $uri .= '?' . $components['query']; } if (array_key_exists('fragment', $components)) { $uri .= '#' . $components['fragment']; } return $uri; } /** * {@inheritdoc} */ public function resolve($uri, $baseUri = null) { // treat non-uri base as local file path if ( !is_null($baseUri) && !filter_var($baseUri, \FILTER_VALIDATE_URL) && !preg_match('|^[^/]+://|u', $baseUri) ) { if (is_file($baseUri)) { $baseUri = 'file://' . realpath($baseUri); } elseif (is_dir($baseUri)) { $baseUri = 'file://' . realpath($baseUri) . '/'; } else { $baseUri = 'file://' . getcwd() . '/' . $baseUri; } } if ($uri == '') { return $baseUri; } $components = $this->parse($uri); $path = $components['path']; if (!empty($components['scheme'])) { return $uri; } $baseComponents = $this->parse($baseUri); $basePath = $baseComponents['path']; $baseComponents['path'] = self::combineRelativePathWithBasePath($path, $basePath); if (isset($components['fragment'])) { $baseComponents['fragment'] = $components['fragment']; } return $this->generate($baseComponents); } /** * Tries to glue a relative path onto an absolute one * * @param string $relativePath * @param string $basePath * * @throws UriResolverException * * @return string Merged path */ public static function combineRelativePathWithBasePath($relativePath, $basePath) { $relativePath = self::normalizePath($relativePath); if ($relativePath == '') { return $basePath; } if ($relativePath[0] == '/') { return $relativePath; } $basePathSegments = explode('/', $basePath); preg_match('|^/?(\.\./(?:\./)*)*|', $relativePath, $match); $numLevelUp = strlen($match[0]) /3 + 1; if ($numLevelUp >= count($basePathSegments)) { throw new UriResolverException(sprintf("Unable to resolve URI '%s' from base '%s'", $relativePath, $basePath)); } $basePathSegments = array_slice($basePathSegments, 0, -$numLevelUp); $path = preg_replace('|^/?(\.\./(\./)*)*|', '', $relativePath); return implode('/', $basePathSegments) . '/' . $path; } /** * Normalizes a URI path component by removing dot-slash and double slashes * * @param string $path * * @return string */ private static function normalizePath($path) { $path = preg_replace('|((?parse($uri); return !empty($components); } } __halt_compiler();----SIGNATURE:----bQBHnxklCcDjq/x41fNl8EQw8RczlBPBYGH3d0aRL24Ufqs6atzGh/uzh2m8shDOvd0+Qhb0FUnnG0V+eklA6Tonb04M1oRN3tMkhqsreOrl4ZTJd0oSU9BQ9Yey6ixm2/pS7D4FH3U/T314CeQxUyGAQuvDWRPKgr4jbnauYbm48CFIcmsvKDmVoKzFHIeunKQuyL2gUTKYlLR08r4Mz39Zi+XOQyu9pDUEy6etmrOInQPaMWT7IzjhanFMQPLMaUe0qQ69KSKbxj5EunVrhnElbi7ZeVEgXg9JcZ3aJASqOD62BY3XCwHJIG9BeOpC6WLBUkvGUkMGEth2PmpgjXMdkk9mP504wzknpQtDeZWkEWDmAhU1TLDEs4+eUEt4/MkvyeuL/xK6qzEecI548V6DPCYgUIHtfDDN1fIVzI93cws2DsReQE8SCF783XKKhk+I3Y0ZwnXjQJc1NdN23CoS8R9r3Y1lunnFcuMfJeRrlhEDwKZIj9pv8nmSwGTz9KwTYpO1ZhqfVAe39SthgBngaVnSLjqusFUh/wgKKuy/M95wEgIksaQDA7Yvq1wEBOKi551e5mjEaJkE030uY/Z2eoDxCYlHQWI5yY8vCo9KqaBITLSCdtne9HuUQ45tt+MDhhWAbmlAYULGyv0z9RSxxeFzwK1gdtwN24LQvzU=----ATTACHMENT:----MjQ1NDU1OTM5MzQ5MDAxOSA4NTI0NjIxMDY4MTI3NjI0IDc2ODE4Nzc3MDIyMDc2NDI=