我的功能对ftp,http和https
没有任何问题function makeClickableLinks($s) {
return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Z?-??-?()0-9@:%_+.~#?&;//=]+)!i',
'<a href="$1">$1</a>', $s);
}
但是,如果网址为www.example.org(如果没有http),则无法点击
如果我将((f|ht)tp(s)?://)
替换为www,它会起作用,但是,如果url有http,它只能在http部分之后点击。
如何使用http和没有http使其正常工作?
答案 0 :(得分:1)
这个正则表达式似乎削减了它。它会检查是否有任何字符串以http,https,ftp或www。
开头它还修复了所有无效链接(以www开头)。
您可以在这里测试正则表达式:https://regex101.com/r/s49eS9/2
function makeClickableLinks($s)
{
return preg_replace_callback('/((((f|ht)tp(s)?:\/\/)|www)[-a-zA-Z?-??-?()0-9@:%_+.~#?&;\/\/=]+)/i', function($matches) {
if (substr($matches[0], 0 , 4) == 'www.') {
// The match starts with www., add a protocol (http:// being the most common).
$matches[0] = 'http://' . $matches[0];
}
return '<a href="' . $matches[0] . '">' . $matches[0] . '</a>';
}, $s);
}
注意:就像@deceze在评论中指出的那样,这对所有网址都不起作用,例如example.com
。制作转换所有有效URL的所有版本的正则表达式将是一项更大的任务,您可能需要列出所有有效的TLD。
修改:根据@deceze
的建议,从str_replace()
更改为使用preg_replace_callback()
来解决无效的www-link情况