Bent merült fel ismét a probléma, hogy hogyan lehet a legegyszerűbben lecserélni egy szövegben a benne található webcímeket (URL) kattintható HTML linkekre. A megtalálásuk igazából annyira nem volt bonyolult, aki írt már pár reguláris kifejezést (regular expression), annak szerintem egy 10-15 perces ujjgyakorlat:
/(?:[a-z]+:\/\/)?(?:\S+?(?::\S+?)?@)?(?:[a-z0-9][a-z0-9-]*[a-z0-9]\.)+[a-z]{2,6}(?:(?:\/|\?).*?(?=\s|<|$))?/imx
Viszont mi van azokkal az URL-ekkel, amik elé nem lett kitéve a protokoll azonosító (pl. http://)? Erre találtam ki azt, hogy – úgysem tudjuk elkerülni azt, hogy ne csak egy preg_replace() legyen – akkor minden href-be rakjuk bele egyből a "http://"-t az elejére és majd utána cseréljük le a "http://protokoll://"-t a "protokoll://"-re.
A kész és működő kód itt látható:
preg_replace(
array(
'/
# protocol (optional)
(?:[a-z]+:\/\/)? # username:password@ (optional)
(?:\S+?(?::\S+?)?@)?
# domain name without tld
(?:[a-z0-9][a-z0-9-]*[a-z0-9]\.)+
# tld
[a-z]{2,6}
# path, query string, fragment (optional)
(?:
# path separator (slash) or query string separator (?)
(?:\/|\?)
# anything until a whitespace, tag opening character (<) or EOL or EOF
.*?
(?=\s|<|$)
)?
/imx',
'/http:\/\/([a-z]+:\/\/)/'
),
array(
'<a href="http://$0">$0</a>',
'$1'
),
$text
);
Amennyiben találnál olyan URL-t, amire a fenti kód nem működik, kérlek tudasd velem és tovább finomítom. URL-ek, amiket próbáltam már (HTML tag-ek között is):
- username:password@example.com/path/file.html?queryString
- http://example.com
- https://username@example.com/path?foo=bar+baz#fragment
- sub.example.com?foo=bar