Parsing, modifying and building URLs.
Contents
- parsing URLs
- building relative and absolute URLs, including protocol-relative URLs
- getting, checking and setting individual URL components:
- scheme
- host
- port
- path
- query parameters
- fragment
- PHP 7.1+
Create a new instance of Url
and use constructor arguments or setters
to define the components:
<?php
use Kuria\Url\Url;
$url = new Url();
$url->setScheme('http');
$url->setHost('example.com');
$url->setPath('/test');
// many more setters are available..
echo $url;
Output:
http://example.com/test
<?php
use Kuria\Url\Url;
$url = Url::parse('http://example.com:8080/test?foo=bar&lorem=ipsum#fragment');
Tip
If you wish to determine the current request URL, you may use the kuria/request-info
component, which integrates with kuria/url
.
Note
Parsing URLs that contain username and a password is supported, but these components are ignored.
Such URLs are deprecated according to RFC 3986.
var_dump(
$url->getScheme(),
$url->getHost(),
$url->getFullHost(),
$url->getPort(),
$url->getPath(),
$url->getQuery(),
$url->getFragment()
);
// checking whether a certain component is defined
var_dump(
$url->hasScheme(),
$url->hasHost(),
$url->hasPort(),
$url->hasPath(),
$url->hasQuery(),
$url->hasFragment()
);
Output:
string(4) "http" string(11) "example.com" string(16) "example.com:8080" int(8080) string(5) "/test" array(2) { ["foo"]=> string(3) "bar" ["lorem"]=> string(5) "ipsum" } string(8) "fragment" bool(true) bool(true) bool(true) bool(true) bool(true) bool(true)
<?php
use Kuria\Url\Url;
$url = Url::parse('/test?foo=bar&lorem%5B0%5D=ipsum&lorem%5B1%5D=dolor');
var_dump(
$url->has('foo'),
$url->has('nonexistent'),
$url->get('foo'),
$url->get('lorem'),
$url->get('nonexistent')
);
Output:
bool(true) bool(false) string(3) "bar" array(2) { [0]=> string(5) "ipsum" [1]=> string(5) "dolor" } NULL
<?php
$url->set('parameter', 'value');
<?php
$url->remove('foo');
<?php
$url->add(['foo' => 'bar', 'lorem' => 'ipsum']);
<?php
$url->setQuery(['foo' => 'bar']);
<?php
$url->removeAll();
These methods will return an absolute or relative URL.
- if no host is specified, a relative URL will be returned
- if the host is specified, an absolute URL will be returned (unless the preferred format option is set to relative)
<?php
use Kuria\Url\Url;
$url = new Url();
$url->setPath('/test');
var_dump($url->build());
$url->setScheme('http');
$url->setHost('example.com');
var_dump($url->build());
Output:
string(5) "/test" string(23) "http://example.com/test"
By default, build()
and __toString()
return an absolute URL if the host is specified.
This behavior can be changed by passing the $preferredFormat
parameter to the constructor,
Url::parse()
or the setPreferredFormat()
method.
Url::RELATIVE
- prefer generating a relative URL even if the host is specifiedUrl::ABSOLUTE
- prefer generating an absolute URL if a host is specified
<?php
use Kuria\Url\Url;
$url = Url::parse('http://example.com/foo');
// print URL using the default preferred format (absolute)
echo $url, "\n";
// set the preferred format to relative
$url->setPreferredFormat(Url::RELATIVE);
echo $url, "\n";
Output:
http://example.com/foo /foo
This method will always return an absolute URL.
If the host is not defined, Kuria\Url\Exception\IncompleteUrlException
will be thrown.
<?php
use Kuria\Url\Url;
$url = new Url();
$url->setScheme('http');
$url->setHost('example.com');
$url->setPath('/test');
var_dump($url->buildAbsolute());
Output:
string(23) "http://example.com/test"
Note
Building an absolute URL with undefined scheme will yield a protocol-relative URL.
Example: //localhost/test
This method will always return a relative URL regardless of whether the host is defined or not.
<?php
use Kuria\Url\Url;
$url = new Url();
$url->setScheme('http');
$url->setHost('example.com');
$url->setPath('/test');
var_dump($url->buildRelative());
Output:
string(5) "/test"