php - 使用http检查链接可点击链接

时间:2016-10-21 08:50:58

标签: php

我的功能对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使其正常工作?

1 个答案:

答案 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情况