fm-labs/php-uri

Simple URI library for PHP


License
MIT

Documentation

php-uri

Simple URI library for PHP. Compliant to PSR-7 UriInterface specification. Includes RFC3968-compliant URI normalizer.

Build Status

Requirements

  • php 7.1+

Installation

$ composer require fm-labs/php-uri ^0.4

Classes

Uri

$uri = \FmLabs\Uri\UriFactory::fromString('http://user:s3cret@www.example.org/test?q=hello#world');
// PSR-7 interface methods
$schema = $uri->getScheme(); // "http"
$host = $uri->getHost(); // "www.example.org"
$path = $uri->getPath(); // "/test"
$frag = $uri->getFragment(); // "world"
$userinfo = $uri->getUserInfo(); // "user:s3cret"
$authority = $uri->getAuthority(); // "user:s3cret@www.example.org"

// Convenience methods
$user = $uri->getUser(); // "user"
$pass = $uri->getUserPass(); // "s3cret"
$queryData = $uri->getQueryData(); // ['q' => 'hello']

// Array access (read-only)
$host = $uri['host'];

// Property access (read-only)
$host = $uri->host;

PSR-7 UriInterface methods

  • getScheme()

  • getHost()

  • getPort()

  • getPath()

  • getQuery()

  • getFragment()

  • getUserInfo()

  • getAuthority()

  • __toString()

  • withScheme()

  • withHost()

  • withPort()

  • withUserInfo()

  • withPath()

  • withQuery()

  • withFragment()

Convenience methods

  • getHostInfo() - Returns hostinfo string
  • getUser() - Returns userinfo username
  • getUserPass() - Returns userinfo password
  • getQueryData(?string $key = null) - Returns query data as array OR value for specific key
  • getComponents() - Returns components as array

Array and Property Access

Available Keys: scheme, host, port, path, query, fragment, user, pass, userinfo, authority, hostinfo, querydata

/** @var \FmLabs\Uri\Uri $uri **/

// Array access
$uri['KEY_NAME'];

// Property access
$uri->KEY_NAME;

UriFactory

Create Uri object from UriFactory

UriFactory::fromString(string $uriString)

// Examples
\FmLabs\Uri\UriFactory::fromString('http://www.example.org');
\FmLabs\Uri\UriFactory::fromString('https://user:secret@www.example.org/my/path?some=query#frag');
\FmLabs\Uri\UriFactory::fromString('https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top');
\FmLabs\Uri\UriFactory::fromString('mailto:John.Doe@example.com');
\FmLabs\Uri\UriFactory::fromString('tel:+1-816-555-1212');
\FmLabs\Uri\UriFactory::fromString('ldap://[2001:db8::7]/c=GB?objectClass?one');
\FmLabs\Uri\UriFactory::fromString('urn:oasis:names:specification:docbook:dtd:xml:4.1.2');

UriFactory::fromComponents(array $components)

// Examples
// http://www.example.org
\FmLabs\Uri\UriFactory::fromComponents(['scheme' => 'http', 'host' => 'www.example.org']);
// tel:+123456789
\FmLabs\Uri\UriFactory::fromComponents(['scheme' => 'tel', 'path' => '+123456789']);

UriFactory::fromUri(UriInterface $uri)

Create \FmLabs\Uri\Uri object from any UriInterface.

UriNormalizer

static normalize()

Normalize URI. See RFC3968 and here.

Returns a new Uri object with normalized components.

$uri = \FmLabs\Uri\UriNormalizer::normalize('hTTp://www.eXample.org:80/test/./../foo/../bar');
// http://www.example.org/test/foo/bar;

Usage

Run tests

$ composer run-script test
// or
$ composer run-script test-verbose
// or
$ ./vendor/bin/phpunit --bootstrap tests/bootstrap.php tests/

TODO

  • UriNormalizer: normalize: Removing dot-segments
  • UriNormalizer: normalize: Removing directory index
  • UriNormalizer: normalize: Removing the fragment
  • UriNormalizer: normalize: Replacing IP with domain name
  • UriNormalizer: normalize: Limiting protocols
  • UriNormalizer: normalize: Removing duplicate slashes
  • UriNormalizer: normalize: Removing or adding “www” as the first domain label
  • UriNormalizer: normalize: Sorting the query parameters
  • UriNormalizer: normalize: Removing unused query variables
  • UriNormalizer: normalize: Removing the "?" when the query is empty

Changelog

[0.5]

  • Changed Uri class: Removed constructor
  • Changed Uri class: Implemented etter method to create new modified instances
  • Changed Uri class: Use class properties instead of property array
  • Added PHP8 annotations
  • Added TravisCI build targets php7.4 & php8.0
  • Added Tests support for PHPUnit9

[0.4]

  • Dropped UriBuilder in favor of UriFactory
  • Added UriFactory
  • Changed Uri constructor
  • Changed PHP language level to 7.1
  • Changed license to MIT license
  • Added: Tests support for PHPUnit8
  • Fixed: Code style

[0.3.1]

  • Added PSR-7 compatibility. Uri now implements PSR UriInterface
  • Added TravisCI build targets php7.2 & php7.3

[0.3]

  • Changed namespace to '\FmLabs\Uri'
  • Changed project name to 'php-uri'
  • Removed UrlExpander class
  • Refactored Url to Uri class
  • Refactored UrlNormalizer to UriNormalizer
  • Added UriBuilder class
  • Upgraded unit tests to PHPUnit6
  • Set min PHP version to 7.0

[0.2]

  • Added UrlExpander util class (requires curl)

License

See LICENSE file