PHPackages                             fm-labs/php-uri - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. fm-labs/php-uri

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

fm-labs/php-uri
===============

Simple URI library for PHP

0.6.1(5y ago)0291MITPHPPHP ^7.1|^8.0CI failing

Since Feb 24Pushed 5y ago1 watchersCompare

[ Source](https://github.com/fm-labs/php-uri)[ Packagist](https://packagist.org/packages/fm-labs/php-uri)[ RSS](/packages/fm-labs-php-uri/feed)WikiDiscussions master Synced 6d ago

READMEChangelogDependencies (2)Versions (9)Used By (0)

php-uri
=======

[](#php-uri)

Simple URI library for PHP. Compliant to PSR-7 UriInterface specification. Includes RFC3968-compliant URI normalizer. Supports PHP 7.1+ and PHP 8.0.

[![Build Status](https://camo.githubusercontent.com/4dc22d0f962ec37aa42418f5de673bf15ee23f3bc23ca68b9a74d936c2b02dd9/68747470733a2f2f7472617669732d63692e6f72672f666d2d6c6162732f7068702d7572692e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/fm-labs/php-uri)

Requirements
------------

[](#requirements)

- php7.1+ | php8.0

Installation
------------

[](#installation)

```
$ composer require fm-labs/php-uri
```

Classes
-------

[](#classes)

### Uri

[](#uri)

```
// > Create new Uri
$uri = \FmLabs\Uri\UriFactory::create();
$uri = $uri
    ->withScheme('https')
    ->withHost('example.org')
    ->withPort(8080)
    ->withPath('/my/path')
    ->withQuery('foo=bar&hello=world')
    ->withFragment('top')
    ->withUserInfo('user', 's3cret');

echo (string)$uri;
// https://user:s3cret@example.org:8080/my/path?foo=bar&hello=world#top
```

```
// > Create Uri from string
$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']
$queryData = $uri->getQueryData('q'); // 'hello'

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

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

#### PSR-7 UriInterface methods

[](#psr-7-uriinterface-methods)

- `getScheme()`
- `getHost()`
- `getPort()`
- `getPath()`
- `getQuery()`
- `getFragment()`
- `getUserInfo()`
- `getAuthority()`
- `__toString()`
- `withScheme()`
- `withHost()`
- `withPort()`
- `withUserInfo()`
- `withPath()`
- `withQuery()`
- `withFragment()`

#### Convenience methods

[](#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

[](#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

[](#urifactory)

Create Uri object with UriFactory class

#### `UriFactory::create()`

[](#urifactorycreate)

```
// Examples
$uri = \FmLabs\Uri\UriFactory::create();
$uri = $uri
    ->withScheme('https')
    ->withHost('example.org');
```

#### `UriFactory::fromString(string $uriString)`

[](#urifactoryfromstringstring-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)`

[](#urifactoryfromcomponentsarray-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)`

[](#urifactoryfromuriuriinterface-uri)

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

```
/** @var \Psr\Http\Message\UriInterface $anyObjectThatImplementsUriInterface */
$uri = \FmLabs\Uri\UriFactory::fromUri($anyObjectThatImplementsUriInterface);
```

### UriNormalizer

[](#urinormalizer)

#### `static normalize()`

[](#static-normalize)

Normalize URI. See [RFC3968](http://tools.ietf.org/html/rfc3986)and [here](http://en.wikipedia.org/wiki/URL_normalization).

Returns a new `Uri` object with normalized components.

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

```
$uri = \FmLabs\Uri\UriFactory::fromString('hTTp://www.eXample.org:80/test/./../foo/../bar');
$normalizer = new \FmLabs\Uri\UriNormalizer($uri);
$uri = $normalizer
    // these normalizations preserve semantics of uri
    ->normalizeScheme()
    ->normalizeHost()
    ->normalizeDotSegements()
    ->normalizeTrailingSlash()
    ->normalizeUnreservedChars()
    ->normalizeEscapeSequences()
    ->normalizeDefaultPorts()
    // these normalizations change semantics of uri
    ->normalizeForceHttps()
    ->normalizeHostIp()
    ->normalizeWwwDomain()
    ->normalizeNonEmptyPath()
    ->normalizeDirectoryIndex()
    ->normalizeDuplicateSlashes()
    ->normalizeFragment()
    ->normalizeQuerySorting()
    ->normalizeEmptyQuery()
    ->getUri();

$normalizedUri = \FmLabs\Uri\UriNormalizer::normalize($uri, ['preserve' => false]);
// http://www.example.org/test/foo/bar;
```

MethodNormalizationExampleResult`normalizeEscapeSequences`Converting percent-encoded triplets to uppercase`http://example.com/foo%2a``http://example.com/foo%2A``normalizeScheme`Converting the scheme to lowercase`HTTP://User@Example.COM/Foo``http://User@Example.COM/Foo``normalizeHost`Converting the host to lowercase`HTTP://User@Example.COM/Foo``HTTP://User@example.com/Foo``normalizeUnreservedChars`Decoding percent-encoded triplets of unreserved characters`http://example.com/%7Efoo``http://example.com/~foo``normalizeDotSegments`Removing dot-segments`http://example.com/foo/./bar/baz/../qux``http://example.com/foo/bar/qux``normalizeTrailingSlash`Converting an empty path to a "/" path`http://example.com``http://example.com/``normalizeDefaultPorts`Removing the default port`http://example.com:80/``http://example.com/``normalizeFragment`Removing the fragment`http://example.com/bar.html#section1``http://example.com/bar.html``normalizeForceHttps`Force protocol`http://example.com/``https://example.com/``normalizeDuplicateSlashes`Removing duplicate slashes`http://example.com/foo//bar.html``http://example.com/foo/bar.html``normalizeEmptyQuery`Removing the "?" when the query is empty`http://example.com/display?``http://example.com/display``normalizeQuerySorting`Sorting the query parameters`http://example.com/display?lang=en&article=fred``http://example.com/display?article=fred&lang=en`@TODO `normalizeHostIp`Replacing IP with domain name`http://123.234.123.234/``http://example.com/`@TODO `normalizeWwwDomain`Removing or adding “www” as the first domain label`http://www.example.com/``http://example.com/`@TODO `normalizeNonEmptyPath`Adding a trailing "/" to a non-empty path`http://example.com/foo``http://example.com/foo/`@TODO `normalizeDirectoryIndex`Removing directory index--@TODO `normalizeQuery`Remove (unused) query variables--Usage
-----

[](#usage)

Run tests
---------

[](#run-tests)

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

TODO
----

[](#todo)

- UriNormalizer: normalize: Removing directory index
- UriNormalizer: normalize: Replacing IP with domain name
- UriNormalizer: normalize: Removing or adding “www” as the first domain label
- UriNormalizer: normalize: Removing unused query variables
- UriNormalizer: Use better semantics for normalization method names to make fluent interface more intuitive
- UriNormalizer: Refactor normalization methods into classes
- UriFactory: Auto-normalize Uri according to RFC
- Add UriFactoryTrait

Changelog
---------

[](#changelog)

\[0.6.1\]

- Added stricter type casting
- Added more Uri tests

\[0.6\]

- Added UriFactory::create() method
- Added UriFactory::setClassName() method
- Added more tests
- Refactored UriNormalizer and added fluent method interface.
- Added more normalization methods

\[0.5\]

- Changed Uri class: Removed constructor
- Changed Uri class: Implemented better 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 &amp; php8.0
- Added Test support for PHPUnit9

\[0.4\]

- Dropped UriBuilder in favor of UriFactory
- Added UriFactory
- Changed Uri constructor
- Changed min PHP language level to 7.1
- Changed license to MIT license
- Added Test support for PHPUnit8
- Fixed Code style

\[0.3.1\]

- Added PSR-7 compatibility. Uri now implements PSR UriInterface
- Added TravisCI build targets php7.2 &amp; 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
- Changed min PHP language level to 7.1

\[0.2\]

- Added UrlExpander util class (requires curl)

License
-------

[](#license)

See LICENSE file

###  Health Score

28

—

LowBetter than 54% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~357 days

Recently: every ~1 days

Total

8

Last Release

1963d ago

PHP version history (3 changes)0.3.1PHP ^7

0.4.0PHP ^7.1

0.5.0PHP ^7.1|^8.0

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5556440?v=4)[fm-labs](/maintainers/fm-labs)[@fm-labs](https://github.com/fm-labs)

---

Top Contributors

[![fm-labs](https://avatars.githubusercontent.com/u/5556440?v=4)](https://github.com/fm-labs "fm-labs (48 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/fm-labs-php-uri/health.svg)

```
[![Health](https://phpackages.com/badges/fm-labs-php-uri/health.svg)](https://phpackages.com/packages/fm-labs-php-uri)
```

###  Alternatives

[google/cloud-core

Google Cloud PHP shared dependency, providing functionality useful to all components.

343121.4M79](/packages/google-cloud-core)[aimeos/aimeos-base

Aimeos base layer for abstracting from host environments

2.1k134.0k1](/packages/aimeos-aimeos-base)[phpgt/dom

Modern DOM API.

12412.2M18](/packages/phpgt-dom)[anthropic-ai/sdk

Anthropic PHP SDK

129134.7k5](/packages/anthropic-ai-sdk)[jaxon-php/jaxon-core

Jaxon is an open source PHP library for easily creating Ajax web applications

73142.3k25](/packages/jaxon-php-jaxon-core)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
