# Класс HttpSoft\Uri\UriNormalizer
Валидирует и нормализует компоненты URI в соответствии со спецификацией RFC 3986.
Реализует HttpSoft\Uri\UriNormalizerInterface и используется внутри HttpSoft\Uri\Uri.
use HttpSoft\Uri\UriNormalizer;
$normalizer = new UriNormalizer();
// Разбирает на компоненты и нормализует URI.
$uriData = $normalizer->normalize('https://example.com/путь?qu$ery=str:ing#fag^ment');
$uriData->getScheme(); // 'https'
$uriData->getHost(); // 'example.com'
$uriData->getPath(); // '/%D0%BF%D1%83%D1%82%D1%8C'
$uriData->getQuery(); // 'qu%24ery=str%3Aing'
$uriData->getFragment(); // 'fag%5Ement'
(string) $uriData; // 'https://example.com/%D0%BF%D1%83%D1%82%D1%8C?qu%24ery=str%3Aing#fag%5Ement'
// Только разбирает на компоненты, но не нормализует URI.
$uriRawData = $normalizer->normalize('https://example.com/путь?qu$ery=str:ing#fag^ment', true);
$uriData->getScheme(); // 'https'
$uriData->getHost(); // 'example.com'
$uriData->getPath(); // '/путь'
$uriData->getQuery(); // 'qu$ery=str:ing'
$uriData->getFragment(); // 'fag^ment'
(string) $uriData; // 'https://example.com/путь?qu$ery=str:ing#fag^ment'
// Нормализовывать компоненты URI можно по отдельности, смотрите ниже описание методов. # Публичные методы
# normalize
Нормализует URI в соответствии с RFC 3986 Syntax Components.
public function normalize(string $uri, bool $raw = false): UriData; Разбирает и нормализует все компоненты URI, вызывая внутри методы: normalizeScheme(), normalizeUserInfo(), normalizeHost(), normalizePort(), normalizePath(), normalizeQuery(), normalizeFragment().
Если
$raw === true, возвращается объект HttpSoft\Uri\UriData с необработанными ненормализованными компонентами URI. Это полезно, если вам нужно разобрать не HTTP-ссылку (mailto,ftp).
# normalizeScheme
Нормализует компонент схемы URI в соответствии с RFC 3986 Scheme.
public function normalizeScheme(string $scheme): string; Если $scheme невалидная или неподдерживаемая, будет брошено исключение \InvalidArgumentException. Поддерживаемые схемы: 'http' и 'https'.
$normalizer->normalizeScheme('https'); // 'https'
$normalizer->normalizeScheme('https:'); // 'https'
$normalizer->normalizeScheme('https://'); // 'https'
$normalizer->normalizeScheme('https:/'); // throws InvalidArgumentException
$normalizer->normalizeScheme('invalid'); // throws InvalidArgumentException
$normalizer->normalizeScheme('mailto'); // throws InvalidArgumentException
$normalizer->normalizeScheme('file'); // throws InvalidArgumentException
$normalizer->normalizeScheme('ftp'); // throws InvalidArgumentException
$normalizer->normalizeScheme('ssh'); // throws InvalidArgumentException # normalizeUserInfo
Нормализует компонент информации о пользователе из URI в соответствии с RFC 3986 User Information.
public function normalizeUserInfo(string $user, ?string $pass = null): string; Если $user пуст, то будет возвращена пустая строка. Если не пуст $user и $pass, вернется строка 'user:pass'. Если не пуст $user, но пуст $pass, вернется строка 'user'.
$normalizer->normalizeUserInfo('', 'password'); // ''
$normalizer->normalizeUserInfo('us<>er'); // 'us%3C%3Eer'
$normalizer->normalizeUserInfo('us%3C%3Eer'); // 'us%3C%3Eer'
$normalizer->normalizeUserInfo('user', 'password'); // 'user:password' # normalizeHost
Нормализует компонент хоста из URI в соответствии с RFC 3986 Host.
public function normalizeHost(string $host): string; Все заглавные латинские буквы будут приведены к строчным и будут удалены все слэши по краям.
$normalizer->normalizeHost('127.0.0.1'); // '127.0.0.1'
$normalizer->normalizeHost('example.com'); // 'example.com'
$normalizer->normalizeHost('Example.com'); // 'example.com'
$normalizer->normalizeHost('//example.com/'); // 'example.com' # normalizePort
Нормализует компонент порта из URI в соответствии с RFC 3986 Port.
public function normalizePort($port): ?int; Если $port не целое число (8080) или не число в строковом представлении ('8080'), или меньше 1, или больше 65535, или не равно null, будет брошено исключение \InvalidArgumentException.
$normalizer->normalizePort(8080); // 8080
$normalizer->normalizePort('8080'); // 8080
$normalizer->normalizePort('80.80'); // 80
$normalizer->normalizePort(null); // null
$normalizer->normalizePort(80.80); // throws InvalidArgumentException
$normalizer->normalizePort('string'); // throws InvalidArgumentException
$normalizer->normalizePort(0); // throws InvalidArgumentException
$normalizer->normalizePort('0'); // throws InvalidArgumentException
$normalizer->normalizePort(65536); // throws InvalidArgumentException
$normalizer->normalizePort('65536'); // throws InvalidArgumentException # normalizePath
Нормализует компонент пути из URI в соответствии с RFC 3986 Path.
public function normalizePath(string $path): string; $path может быть либо пустым, либо абсолютным (начинаться со слэша), либо бескорневым (не начинаться со слэша). Если $path содержит символ ? или #, будет брошено исключение \InvalidArgumentException.
$normalizer->normalizePath(''); // ''
$normalizer->normalizePath('/'); // '/'
$normalizer->normalizePath('path/to/act<>ion'); // 'path/to/act%3C%3Eion'
$normalizer->normalizePath('path/to/act%3C%3Eion'); // 'path/to/act%3C%3Eion'
$normalizer->normalizePath('/path/to/action'); // '/path/to/action'
$normalizer->normalizePath('/path/to/action/'); // '/path/to/action/'
$normalizer->normalizePath('///path/to/action///'); // '/path/to/action/'
$normalizer->normalizePath('path/to/action?query=string') // throws InvalidArgumentException
$normalizer->normalizePath('path/to/action#fragment') // throws InvalidArgumentException # normalizeQuery
Нормализует компонент строки запроса из URI в соответствии с RFC 3986 Query.
public function normalizeQuery(string $query): string; $query может быть либо пустым, либо начинаться со знака вопроса, либо не начинаться со знака вопроса. Если $query содержит символ #, будет брошено исключение \InvalidArgumentException.
$normalizer->normalizeQuery('?qu$ery'); // 'qu%24ery'
$normalizer->normalizeQuery('?qu%24ery'); // 'qu%24ery'
$normalizer->normalizeQuery('query=str<>ing'); // 'query=str%3C%3Eing'
$normalizer->normalizeQuery('query=str%3C%3Eing'); // 'query=str%3C%3Eing'
$normalizer->normalizeQuery('?key1=value1&key2=value2'); // 'key1=value1&key2=value2'
$normalizer->normalizeQuery('query=string#fragment') // throws InvalidArgumentException # normalizeFragment
Нормализует компонент фрагмента (хеша) из URI в соответствии с RFC 3986 Fragment.
public function normalizeFragment(string $fragment): string; $fragment может содержать любую строку, может начинаться с символа #, а может не начинаться с символа #.
$normalizer->normalizeFragment('frag<>ment'); // 'frag%3C%3Ement'
$normalizer->normalizeFragment('#frag<>ment'); // 'frag%3C%3Ement'
$normalizer->normalizeFragment('#frag%3C%3Ement'); // 'frag%3C%3Ement' 