Closed corenominal closed 1 month ago
auto_link()
.The regex is not changed from the beginning.
preg_match_all('#(\w*://|www\.)[^\s()<>;]+\w#i', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)
But the regex in CI3 is the following:
preg_match_all('#(\w*://|www\.)[a-z0-9]+(-+[a-z0-9]+)*(\.[a-z0-9]+(-+[a-z0-9]+)*)+(/([^\s()<>;]+\w)?/?)?#i', $str, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)
It seems it was changed in https://github.com/bcit-ci/CodeIgniter/commit/8c9e51044d991868228dba8b9d5141998347dbfe.
But before the change, there was already /?
(not …+\w#i
but …+\w/?#i
) in the end.
Thanks for looking into this. I messed up with my PR, apologies.
No problem. It is almost impossible for anyone to send a perfect PR at first.
I sent #9169. Please check.
@codeigniter4/core-team
This is clearly documented, but why auto_link()
recognizes a string starting with ://
?
The link <a href="://codeigniter.com">://codeigniter.com</a>
does not seem to work.
If I put the link in the Welcome page, the URL will be http://localhost:8080/://codeigniter.com
.
Note The only URLs recognized are those that start with
www.
or with://
. https://codeigniter4.github.io/CodeIgniter4/helpers/url_helper.html#auto_link
I guess that ://
would support cases for: https
, http
, ftp
, etc.
Yes, 'test abc://www.codeigniter.com test'
will be 'test <a href="abc://www.codeigniter.com">abc://www.codeigniter.com</a> test'
. But it does not make sense.
The range of what will "catch" on this rule is large, but thanks to this we have support for all direct links that are supported by many apps, like slack://
- https://api.slack.com/reference/deep-linking#client
Telegram API https://core.telegram.org/api/links
Okay, the current behavior seems useful, and can catch unknown schemes.
But catching ://codeigniter.com
does not make sense.
Should it catch [a-z0-9]+://
?
RFC 3986 states that the scheme component is required.
The scheme and path components are required, though the path may be empty (no characters).
I would think that it should catch [a-z0-9]+://
.
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) https://datatracker.ietf.org/doc/html/rfc3986#section-3.1
[a-z][a-z0-9+\-.]*://
is better?
[a-z][a-z0-9+\-.]*://
is better?
Yes.
I sent #9180
PHP Version
8.2
CodeIgniter4 Version
4.5.4
CodeIgniter4 Installation Method
Composer (using
codeigniter4/appstarter
)Which operating systems have you tested for this bug?
Linux
Which server did you use?
apache
Database
No response
What happened?
Using the URL Helper
auto_link()
function to automatically turn URLs contained in a string into links/HTML anchor elements. If the last character of the URL is a /, it is not included in either the anchor href value or text value.Steps to Reproduce
Input:
Output:
Expected Output
Anything else?
I came across this as it seems that the default behaviour of Chrome and Firefox is to include the trailing slash when copying the URL from the browser's address bar. I tend to do this a lot and noticed that the
auto_link()
function always missed the trailing slash when creating anchor elements.