Skip to content

Commit 8db46b3

Browse files
committed
Improve UriString implementation
1 parent 4bc0e43 commit 8db46b3

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

interfaces/UriString.php

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,18 @@ final class UriString
8484
];
8585

8686
/**
87-
* Range of invalid characters in URI string.
87+
* Range of invalid characters in URI 3986 string.
8888
*
8989
* @var string
9090
*/
91-
private const REGEXP_INVALID_URI_CHARS = '/[\x00-\x1f\x7f\s]/';
91+
private const REGEXP_INVALID_URI_RFC3986_CHARS = '/^(?:[A-Za-z0-9\-._~:\/?#[\]@!$&\'()*+,;=%]|%[0-9A-Fa-f]{2})*$/';
92+
93+
/**
94+
* Range of invalid characters in URI 3987 string.
95+
*
96+
* @var string
97+
*/
98+
private const REGEXP_INVALID_URI_RFC3987_CHARS = '/[\x00-\x1f\x7f\s]/';
9299

93100
/**
94101
* RFC3986 regular expression URI splitter.
@@ -497,12 +504,12 @@ private static function resolvePathAndQuery(array $uri, array $baseUri): array
497504

498505
public static function containsValidRfc3986Characters(Stringable|string $uri): bool
499506
{
500-
return 1 === preg_match('/^(?:[A-Za-z0-9\-._~:\/?#[\]@!$&\'()*+,;=%]|%[0-9A-Fa-f]{2})*$/', (string) $uri);
507+
return 1 === preg_match(self::REGEXP_INVALID_URI_RFC3986_CHARS, (string) $uri);
501508
}
502509

503-
public static function containsValidCharacters(Stringable|string $uri): bool
510+
public static function containsValidRfc3987Characters(Stringable|string $uri): bool
504511
{
505-
return 1 === preg_match(self::REGEXP_INVALID_URI_CHARS, (string) $uri);
512+
return 1 === preg_match(self::REGEXP_INVALID_URI_RFC3987_CHARS, (string) $uri);
506513
}
507514

508515
/**
@@ -557,9 +564,7 @@ public static function parse(Stringable|string|int $uri): array
557564
return $components;
558565
}
559566

560-
if (1 === preg_match(self::REGEXP_INVALID_URI_CHARS, $uri)) {
561-
throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri));
562-
}
567+
self::containsValidRfc3987Characters($uri) || throw new SyntaxError(sprintf('The uri `%s` contains invalid characters', $uri));
563568

564569
//if the first character is a known URI delimiter parsing can be simplified
565570
$first_char = $uri[0];

0 commit comments

Comments
 (0)