@@ -22,16 +22,22 @@ final class UrlAutolinkParser implements InlineParserInterface
2222{
2323 private const ALLOWED_AFTER = [null , ' ' , "\t" , "\n" , "\x0b" , "\x0c" , "\x0d" , '* ' , '_ ' , '~ ' , '( ' ];
2424
25- // RegEx adapted from https://github.com/symfony/symfony/blob/4.2 /src/Symfony/Component/Validator/Constraints/UrlValidator.php
25+ // RegEx adapted from https://github.com/symfony/symfony/blob/6.3 /src/Symfony/Component/Validator/Constraints/UrlValidator.php
2626 private const REGEX = '~
2727 (
2828 # Must start with a supported scheme + auth, or "www"
2929 (?:
30- (?:%s):// # protocol
31- (?:([\ .\pL\pN-]+:)?([\ .\pL\pN-]+)@)? # basic auth
30+ (?:%s):// # protocol
31+ (?:(?:(?:[\_\ .\pL\pN-]|%%[0-9A-Fa-f]{2}) +:)?((?:[\_\ .\pL\pN-]|%%[0-9A-Fa-f]{2}) +)@)? # basic auth
3232 |www\.)
3333 (?:
34- (?:[\pL\pN\pS\-\.])+(?:\.?(?:[\pL\pN]|xn\-\-[\pL\pN-]+)+\.?) # a domain name
34+ (?:
35+ (?:xn--[a-z0-9-]++\.)*+xn--[a-z0-9-]++ # a domain name using punycode
36+ |
37+ (?:[\pL\pN\pS\pM\-\_]++\.)+[\pL\pN\pM]++ # a multi-level domain name
38+ |
39+ [a-z0-9\-\_]++ # a single-level domain name
40+ )\.?
3541 | # or
3642 \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address
3743 | # or
@@ -40,9 +46,9 @@ final class UrlAutolinkParser implements InlineParserInterface
4046 \] # an IPv6 address
4147 )
4248 (?::[0-9]+)? # a port (optional)
43- (?:/ (?:[\pL\pN\-._\~!$& \'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )* # a path
44- (?:\? (?:[\pL\pN\-._\~!$& \'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional)
45- (?:\# (?:[\pL\pN\-._\~!$& \'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a fragment (optional)
49+ (?:/ (?:[\pL\pN\-._\~!$& \'()*+,;=:@]|%%[0-9A-Fa-f]{2})* )* # a path
50+ (?:\? (?:[\pL\pN\-._\~!$& \'\[\] ()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a query (optional)
51+ (?:\# (?:[\pL\pN\-._\~!$& \'()*+,;=:@/?]|%%[0-9A-Fa-f]{2})* )? # a fragment (optional)
4652 )~ixu ' ;
4753
4854 /**
0 commit comments