@@ -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