我遇到的情况是我的文本包含URL链接。链接有2种形式

  • www.stackoverflow.com
  • 堆栈溢出

  • 我正在尝试创建一个使用正则表达式的简单函数,该函数将使用HREF标签包装 1 类型的所有链接,而其他链接则已被单独包装。

    我有这样的事情,但没有成功。
    function replaceURLWithHTMLLinks(text) {
        var exp = /(<(\s*)a(\s)*href.*>.*<\/(\s)*a(\s*)>)/ig;
        var matches = exp.exec(text);
        for(var i=0; i < matches.length; i++) {
            var line = matches[i];
            if(!exp.test(line)) {
                var exp2 = /(\b(?:(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$])|”(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^"\r\n]+”?|’(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^'\r\n]+’?)/ig;
                text = text.replace("http://","");
                    text = text.replace(exp2, "<a href=http://$1>$1</a>");
            }
        }
    
        return text;
    }
    

    它不起作用,但希望有人可以解决它:)

    编辑

    借助@MikeM答案修复了此问题的解决方案
    function replaceLinksSO(text) {
        rex = /(<a href=")?(?:https?:\/\/)?(?:(?:www)[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+\.)+[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+/ig;
        return text.replace(rex, function ( $0, $1 ) {
            if(/^https?:\/\/.+/i.test($0)) {
                return $1 ? $0: '<a href="'+$0+'">'+$0+'</a>';
            }
            else {
                return $1 ? $0: '<a href="http://'+$0+'">'+$0+'</a>';
            }
        });
    }
    

    最佳答案

    在不尝试分析上面复杂的正则表达式和功能的情况下,这是一个使用玩具网址匹配模式的示例实现,以说明进行此类替换的方法

    var str = ' www.stackoverflow.com  <a href="http://www.somesite.com">somesite</a> www.othersite.org '
        rex = /(<a href=")?(?:https?:\/\/)?(?:\w+\.)+\w+/g;
    
    str = str.replace( rex, function ( $0, $1 ) {
        return $1 ? $0 : '<a href="' + $0 + '">' + $0 + '</a>';
    });
    

    您可以更改网址匹配模式并插入例如所需的\s*

    09-25 11:33