class EasyRdf_ParsedUri

A RFC3986 compliant URI parser

@package EasyRdf @copyright Copyright (c) 2009-2013 Nicholas J Humfrey @license http://www.opensource.org/licenses/bsd-license.php @link http://www.ietf.org/rfc/rfc3986.txt

Hierarchy

Expanded class hierarchy of EasyRdf_ParsedUri

File

core/modules/rdf/tests/src/Traits/EasyRdf_ParsedUri.php, line 59

Namespace

Drupal\Tests\rdf\Traits
View source
class EasyRdf_ParsedUri {
    // For all URIs:
    private $scheme = null;
    private $fragment = null;
    // For hierarchical URIs:
    private $authority = null;
    private $path = null;
    private $query = null;
    const URI_REGEX = "|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?|";
    
    /** Constructor for creating a new parsed URI
     *
     * The $uri parameter can either be a string or an
     * associative array with the following keys:
     * scheme, authority, path, query, fragment
     *
     * @param  mixed $uri  The URI as a string or an array
     * @return object EasyRdf_ParsedUri
     */
    public function __construct($uri = null) {
        if (is_string($uri)) {
            if (preg_match(self::URI_REGEX, $uri, $matches)) {
                if (!empty($matches[1])) {
                    $this->scheme = isset($matches[2]) ? $matches[2] : '';
                }
                if (!empty($matches[3])) {
                    $this->authority = isset($matches[4]) ? $matches[4] : '';
                }
                $this->path = isset($matches[5]) ? $matches[5] : '';
                if (!empty($matches[6])) {
                    $this->query = isset($matches[7]) ? $matches[7] : '';
                }
                if (!empty($matches[8])) {
                    $this->fragment = isset($matches[9]) ? $matches[9] : '';
                }
            }
        }
        elseif (is_array($uri)) {
            $this->scheme = isset($uri['scheme']) ? $uri['scheme'] : null;
            $this->authority = isset($uri['authority']) ? $uri['authority'] : null;
            $this->path = isset($uri['path']) ? $uri['path'] : null;
            $this->query = isset($uri['query']) ? $uri['query'] : null;
            $this->fragment = isset($uri['fragment']) ? $uri['fragment'] : null;
        }
    }
    
    /** Returns true if this is an absolute (complete) URI
     * @return boolean
     */
    public function isAbsolute() {
        return $this->scheme !== null;
    }
    
    /** Returns true if this is an relative (partial) URI
     * @return boolean
     */
    public function isRelative() {
        return $this->scheme === null;
    }
    
    /** Returns the scheme of the URI (e.g. http)
     * @return string
     */
    public function getScheme() {
        return $this->scheme;
    }
    
    /** Sets the scheme of the URI (e.g. http)
     * @param string $scheme The new value for the scheme of the URI
     */
    public function setScheme($scheme) {
        $this->scheme = $scheme;
    }
    
    /** Returns the authority of the URI (e.g. www.example.com:8080)
     * @return string
     */
    public function getAuthority() {
        return $this->authority;
    }
    
    /** Sets the authority of the URI (e.g. www.example.com:8080)
     * @param string $authority The new value for the authority component of the URI
     */
    public function setAuthority($authority) {
        $this->authority = $authority;
    }
    
    /** Returns the path of the URI (e.g. /foo/bar)
     * @return string
     */
    public function getPath() {
        return $this->path;
    }
    
    /** Set the path of the URI (e.g. /foo/bar)
     * @param string $path The new value for the path component of the URI
     */
    public function setPath($path) {
        $this->path = $path;
    }
    
    /** Returns the query string part of the URI (e.g. foo=bar)
     * @return string
     */
    public function getQuery() {
        return $this->query;
    }
    
    /** Set the query string of the URI (e.g. foo=bar)
     * @param string $query The new value for the query string component of the URI
     */
    public function setQuery($query) {
        $this->query = $query;
    }
    
    /** Returns the fragment part of the URI (i.e. after the #)
     * @return string
     */
    public function getFragment() {
        return $this->fragment;
    }
    
    /** Set the fragment of the URI (i.e. after the #)
     * @param string $fragment The new value for the fragment component of the URI
     */
    public function setFragment($fragment) {
        $this->fragment = $fragment;
    }
    
    /**
     * Normalizes the path of this URI if it has one. Normalizing a path means
     * that any unnecessary '.' and '..' segments are removed. For example, the
     * URI http://example.com/a/b/../c/./d would be normalized to
     * http://example.com/a/c/d
     *
     * @return object EasyRdf_ParsedUri
     */
    public function normalize() {
        if (empty($this->path)) {
            return $this;
        }
        // Remove ./ from the start
        if (substr($this->path, 0, 2) == './') {
            // Remove both characters
            $this->path = substr($this->path, 2);
        }
        // Remove /. from the end
        if (substr($this->path, -2) == '/.') {
            // Remove only the last dot, not the slash!
            $this->path = substr($this->path, 0, -1);
        }
        if (substr($this->path, -3) == '/..') {
            $this->path .= '/';
        }
        // Split the path into its segments
        $segments = explode('/', $this->path);
        $newSegments = array();
        // Remove all unnecessary '.' and '..' segments
        foreach ($segments as $segment) {
            if ($segment == '..') {
                // Remove the previous part of the path
                $count = count($newSegments);
                if ($count > 0 && $newSegments[$count - 1]) {
                    array_pop($newSegments);
                }
            }
            elseif ($segment == '.') {
                // Ignore
                continue;
            }
            else {
                array_push($newSegments, $segment);
            }
        }
        // Construct the new normalized path
        $this->path = implode('/', $newSegments);
        // Allow easy chaining of methods
        return $this;
    }
    
    /**
     * Resolves a relative URI using this URI as the base URI.
     */
    public function resolve($relUri) {
        // If it is a string, then convert it to a parsed object
        if (is_string($relUri)) {
            $relUri = new EasyRdf_ParsedUri($relUri);
        }
        // This code is based on the pseudocode in section 5.2.2 of RFC3986
        $target = new EasyRdf_ParsedUri();
        if ($relUri->scheme) {
            $target->scheme = $relUri->scheme;
            $target->authority = $relUri->authority;
            $target->path = $relUri->path;
            $target->query = $relUri->query;
        }
        else {
            if ($relUri->authority) {
                $target->authority = $relUri->authority;
                $target->path = $relUri->path;
                $target->query = $relUri->query;
            }
            else {
                if (empty($relUri->path)) {
                    $target->path = $this->path;
                    if ($relUri->query) {
                        $target->query = $relUri->query;
                    }
                    else {
                        $target->query = $this->query;
                    }
                }
                else {
                    if (substr($relUri->path, 0, 1) == '/') {
                        $target->path = $relUri->path;
                    }
                    else {
                        $path = $this->path;
                        $lastSlash = strrpos($path, '/');
                        if ($lastSlash !== false) {
                            $path = substr($path, 0, $lastSlash + 1);
                        }
                        else {
                            $path = '/';
                        }
                        $target->path .= $path . $relUri->path;
                    }
                    $target->query = $relUri->query;
                }
                $target->authority = $this->authority;
            }
            $target->scheme = $this->scheme;
        }
        $target->fragment = $relUri->fragment;
        $target->normalize();
        return $target;
    }
    
    /** Convert the parsed URI back into a string
     *
     * @return string The URI as a string
     */
    public function toString() {
        $str = '';
        if ($this->scheme !== null) {
            $str .= $this->scheme . ':';
        }
        if ($this->authority !== null) {
            $str .= '//' . $this->authority;
        }
        $str .= $this->path;
        if ($this->query !== null) {
            $str .= '?' . $this->query;
        }
        if ($this->fragment !== null) {
            $str .= '#' . $this->fragment;
        }
        return $str;
    }
    
    /** Magic method to convert the URI, when casted, back to a string
     *
     * @return string The URI as a string
     */
    public function __toString() {
        return $this->toString();
    }

}

Members

Title Sort descending Modifiers Object type Summary
EasyRdf_ParsedUri::$authority private property
EasyRdf_ParsedUri::$fragment private property
EasyRdf_ParsedUri::$path private property
EasyRdf_ParsedUri::$query private property
EasyRdf_ParsedUri::$scheme private property
EasyRdf_ParsedUri::getAuthority public function Returns the authority of the URI (e.g. www.example.com:8080)
EasyRdf_ParsedUri::getFragment public function Returns the fragment part of the URI (i.e. after the #)
EasyRdf_ParsedUri::getPath public function Returns the path of the URI (e.g. /foo/bar)
EasyRdf_ParsedUri::getQuery public function Returns the query string part of the URI (e.g. foo=bar)
EasyRdf_ParsedUri::getScheme public function Returns the scheme of the URI (e.g. http)
EasyRdf_ParsedUri::isAbsolute public function Returns true if this is an absolute (complete) URI
EasyRdf_ParsedUri::isRelative public function Returns true if this is an relative (partial) URI
EasyRdf_ParsedUri::normalize public function Normalizes the path of this URI if it has one. Normalizing a path means
that any unnecessary '.' and '..' segments are removed. For example, the
URI http://example.com/a/b/../c/./d would be normalized to
http://example.com/a/c/d
EasyRdf_ParsedUri::resolve public function Resolves a relative URI using this URI as the base URI.
EasyRdf_ParsedUri::setAuthority public function Sets the authority of the URI (e.g. www.example.com:8080)
EasyRdf_ParsedUri::setFragment public function Set the fragment of the URI (i.e. after the #)
EasyRdf_ParsedUri::setPath public function Set the path of the URI (e.g. /foo/bar)
EasyRdf_ParsedUri::setQuery public function Set the query string of the URI (e.g. foo=bar)
EasyRdf_ParsedUri::setScheme public function Sets the scheme of the URI (e.g. http)
EasyRdf_ParsedUri::toString public function Convert the parsed URI back into a string
EasyRdf_ParsedUri::URI_REGEX constant
EasyRdf_ParsedUri::__construct public function Constructor for creating a new parsed URI
EasyRdf_ParsedUri::__toString public function Magic method to convert the URI, when casted, back to a string

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.