Extensia URI (Uri\Rfc3986\Uri, Uri\WhatWg\Url) în PHP

URL și HTTP PHP 8.5+

Clase pentru citirea, validarea și modificarea adreselor URL după standardele RFC 3986 și WHATWG, incluse în PHP 8.5.

Sintaxă
Uri\Rfc3986\Uri::parse(string $uri, ?Uri\Rfc3986\Uri $baseUrl = null): ?static
new Uri\WhatWg\Url(string $uri, ?Uri\WhatWg\Url $baseUrl = null, &$softErrors = null)

Ce face Extensia URI (Uri\Rfc3986\Uri, Uri\WhatWg\Url)

Extensia URI, inclusă mereu în PHP 8.5, are două clase. Uri\Rfc3986\Uri respectă standardul RFC 3986 (URI generice). Uri\WhatWg\Url respectă standardul WHATWG URL, adică interpretează adresele exact ca un browser, inclusiv normalizarea (litere mici în domeniu, rezolvarea ../).

Spre deosebire de parse_url(), clasele validează adresa și oferă metode pentru fiecare parte: getScheme(), getHost(), getPort(), getPath(), getQuery(), getFragment(). Obiectele sunt imutabile: metodele with...() (de exemplu withPath()) returnează un obiect nou.

La o adresă invalidă, Uri\Rfc3986\Uri::parse() returnează null, iar constructorii aruncă o excepție (Uri\InvalidUriException, respectiv Uri\WhatWg\InvalidUrlException).

Parametri

Parametru Descriere
$uri Adresa de citit.
$baseUrl Opțional. Adresa de bază, pentru a rezolva adrese relative (../poze/a.jpg).

Ce returnează

Un obiect URI imutabil (sau null pentru Uri\Rfc3986\Uri::parse() la o adresă invalidă).

Exemple

Exemplul 1: Părțile unei adrese

<?php
$uri = Uri\Rfc3986\Uri::parse("https://www.dexblog.ro:8080/invata/php/?q=pipe#exemple");

echo $uri->getScheme() . "\n";
echo $uri->getHost() . "\n";
echo $uri->getPort() . "\n";
echo $uri->getPath() . "\n";
echo $uri->getQuery() . "\n";
echo $uri->getFragment() . "\n";

var_dump(Uri\Rfc3986\Uri::parse("adresă cu spații"));

Rezultat

https
www.dexblog.ro
8080
/invata/php/
q=pipe
exemple
NULL

Exemplul 2: Normalizare ca în browser (WHATWG)

<?php
$url = new Uri\WhatWg\Url("HTTPS://Exemplu.RO/produse/../cos?id=7");
echo $url->toAsciiString() . "\n";

$relativ = new Uri\WhatWg\Url("../poze/paine.jpg", new Uri\WhatWg\Url("https://exemplu.ro/magazin/produse/"));
echo $relativ->toAsciiString();

Rezultat

https://exemplu.ro/cos?id=7
https://exemplu.ro/magazin/poze/paine.jpg

Exemplul 3: Modificare fără a strica restul adresei

<?php
$uri = Uri\Rfc3986\Uri::parse("https://exemplu.ro/cautare?oras=Iasi");
$nou = $uri->withPath("/rezultate")->withQuery("oras=Cluj&pagina=2");

echo $uri->toString() . "\n";
echo $nou->toString();

Rezultat

https://exemplu.ro/cautare?oras=Iasi
https://exemplu.ro/rezultate?oras=Cluj&pagina=2

Greșeli frecvente

  • Te bazezi pe parse_url() pentru validare: acceptă multe adrese invalide și are reguli proprii. Pentru validare folosește noile clase.
  • Amesteci cele două standarde: un URL care trece de WHATWG poate fi interpretat altfel de RFC 3986. Alege Uri\WhatWg\Url pentru adrese venite din browser și Uri\Rfc3986\Uri pentru URI generice.
  • Uiți că obiectele sunt imutabile: $uri->withPath("/x"); fără atribuire nu schimbă nimic.

Comenzi înrudite

  • parse_url: Împarte un URL în componente: protocol, domeniu, port, cale, interogare și fragment.
  • http_build_query: Transformă un tablou în textul de interogare al unui URL (a=1&b=2), cu toate valorile codate corect.
  • urlencode / urldecode: Codează un text ca să poată fi pus în siguranță într-un URL, ca valoare a unui parametru (după ?).
  • filter_var: Validează sau curăță o valoare: email, număr întreg, URL, adresă IP, valoare booleană.