如何用链接替换纯URL?


453

我正在使用下面的功能来匹配给定文本内的URL,并将其替换为HTML链接。正则表达式效果很好,但目前我仅替换第一场比赛。

如何替换所有URL?我想我应该使用exec命令,但是我没有真正弄清楚该怎么做。

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
    return text.replace(exp,"<a href='$1'>$1</a>"); 
}

Answers:


350

首先,滚动自己的regexp来解析URL是一个糟糕的主意。您必须想象这是一个很常见的问题,根据RFC,有人为此编写,调试和测试了一个库。URI很复杂 -请在Node.jsURI方案的Wikipedia页面上查看用于URL解析代码

解析URL时有很多边缘情况:国际域名,实际(.museum)与不存在(.etc)TLD,包含括号的怪异标点,URL末尾的标点,IPV6主机名等。

我已经看了一吨图书馆,并有几个值得使用,尽管一些缺点:

我已迅速被取消此任务资格的图书馆:

如果您坚持使用正则表达式,那么最全面的是ComponentURL regexp,尽管它会通过查看错误地检测出一些不存在的两个字母的TLD。


3
可惜的URL regexp from Component是没有发表评论,对其所作的一些解释会有所帮助。Autolinker.js评论得很好,并经过测试。尽管没有测试,但urlize.jsVebjorn Ljosa的答案中链接到的库 看起来也很有特色且维护良好。
山姆·哈斯勒

1
Regex101.com自动“解释”该正则表达式,但是祝您好运:)我还很快发现了一个无效案例,其中包含无效的TLD(相同链接)。
Dan Dascalescu 2014年

1
@SamHasler:自动链接器需要在TLD和IDN区域中进行改进。添加了一些测试
Dan Dascalescu 2014年

2
很好奇没有人提到约翰·格鲁伯(John Gruber)在维护URL正则表达式模式方面的努力。这不是解决问题的唯一/理想方法,但如果您要推出自己的解决方案,则无论如何都值得研究。只是想添加此作为参考。
oelna 2014年

2
@DanDascalescu看看这个markdown-it.github.io/linkify-it。该库仅专注于一项任务-检测文本中的链接模式。但我希望它做得很好。例如,它具有正确的unicode支持,包括星体字符。它支持国际顶级域名。
维塔利2015年

285

用链接替换URL(常见问题的答案)

问题中的正则表达式遗漏了很多极端情况。检测URL时,最好使用专门的库来处理国际域名,.museumURL内和末尾的新TLD(例如,括号和其他标点符号)以及许多其他情况。有关其他一些问题的说明,请参见Jeff Atwood的博客文章“ URL的问题”。

URL匹配库最佳摘要Dan Dascalescu的答案+100
(截至2014年2月)


“使一个正则表达式替换多个匹配项”(针对特定问题的答案)

在正则表达式的末尾添加“ g”以启用全局匹配:

/ig;

但这只能解决正则表达式仅替换第一个匹配项的问题。不要使用该代码。


149

我对Travis的代码做了一些小的修改(只是为了避免任何不必要的重新声明-但这对我的需求非常有用,太好了!):

function linkify(inputText) {
    var replacedText, replacePattern1, replacePattern2, replacePattern3;

    //URLs starting with http://, https://, or ftp://
    replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
    replacedText = inputText.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');

    //URLs starting with "www." (without // before it, or it'd re-link the ones done above).
    replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
    replacedText = replacedText.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');

    //Change email addresses to mailto:: links.
    replacePattern3 = /(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)/gim;
    replacedText = replacedText.replace(replacePattern3, '<a href="mailto:$1">$1</a>');

    return replacedText;
}

1
如何编辑此代码以免损害嵌入对象和iframe。.(youtube嵌入对象和iframe)
Pradyut Bhattacharya 2010年

5
代码中存在一个与此处的电子邮件地址匹配的错误。[a-zA-Z]{2,6}应该阅读一些类似的内容(?:[a-zA-Z]{2,6})+以匹配更复杂的域名,例如email@example.co.uk。
Roshambo

1
我遇到了一些问题;最初只是HTTP://或http:// WWW(不含空间WWW即便如此分析这个错误显然)将创建一个链接。并链接到http:// www。域。com(不带空格)将创建一个空链接,然后在href字段中创建一个附加了锚定结束标记的链接。
阿尔弗雷德·

1
没有http://或没有URL www呢?这对这类网址有用吗?
内森

2
我试图编辑原始帖子以解决mailto问题,但是我必须至少添加6个字符才能进行编辑。但是,如果您更改此行:replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;使用此行replacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;可解决mailto问题:)
yourdeveloperfriend 2013年

69

Linkify()上面的Travis 代码进行了一些优化。我还修复了一个错误,该错误导致子域类型格式的电子邮件地址不匹配(即example@domain.co.uk)。

另外,我将实现更改为String类的原型,以便可以按以下方式匹配项目:

var text = 'address@example.com';
text.linkify();

'http://stackoverflow.com/'.linkify();

无论如何,这是脚本:

if(!String.linkify) {
    String.prototype.linkify = function() {

        // http://, https://, ftp://
        var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;

        // www. sans http:// or https://
        var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;

        // Email addresses
        var emailAddressPattern = /[\w.]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim;

        return this
            .replace(urlPattern, '<a href="$&">$&</a>')
            .replace(pseudoUrlPattern, '$1<a href="http://$2">$2</a>')
            .replace(emailAddressPattern, '<a href="mailto:$&">$&</a>');
    };
}

我认为最好的是,原型功能使事情变得更加干净:)
MRVDOG 2014年

似乎不适用于此类电子邮件地址:info@some-thing.com some.thing@example.com等。–
Marco Gagliardi

@MarcoGagliardi好收获。固定。
Roshambo 2014年

1
这不适用于字符串“ git clone aaaa@bitbucket.org/ooo/bbb-cc-dd.git ”。它将字符串分解成块,并创建了多个锚点,例如“ git clone <a href="https://<a href="mailto:aaaa@bitbucket.org"> aaaa@bitbucket.org </a> / ooo / bbb-cc-dd.git“> https:// <a href="mailto:aaaa@bitbucket.org"> aaaa@bitbucket.org </a> /ooo/bbb-cc-dd.git </a> “
杰宾2015年

1
不适+用于电子邮件用户名(例如)foo+bar@domain.com。我用电子邮件模式修复了它/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim(请注意+第一个括号中的),但是我不知道这是否会破坏其他功能。
dchacke

24

谢谢,这非常有帮助。我还希望可以链接看起来像URL的东西-作为基本要求,即使没有http://协议前缀,它也可以链接www.yahoo.com之类的东西。所以基本上,如果是“ www” 存在,它将链接它并假定它是http://。我还希望电子邮件变成mailto:链接。示例:www.yahoo.com将转换为www.yahoo.com

这是我最终得到的代码(此页面的代码与我在网上找到的其他内容以及我自己完成的其他内容的组合):

function Linkify(inputText) {
    //URLs starting with http://, https://, or ftp://
    var replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
    var replacedText = inputText.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');

    //URLs starting with www. (without // before it, or it'd re-link the ones done above)
    var replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
    var replacedText = replacedText.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');

    //Change email addresses to mailto:: links
    var replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
    var replacedText = replacedText.replace(replacePattern3, '<a href="mailto:$1">$1</a>');

    return replacedText
}

在第二次替换中,(^ | [^ /])部分仅在未以//开头的情况下替换www.whatever.com,以防止双重链接(如果在第一次替换中已经链接了URL)。另外,www.whatever.com可能位于字符串的开头,这是正则表达式中该部分的第一个“或”条件。

可以将其集成为jQuery插件(如上面的Jesse P所示),但是我特别希望一个不对现有DOM元素起作用的常规函数​​,因为我要获取已有的文本,然后将其添加到DOM中,在添加文本之前,我希望文本被“链接化”,因此我通过此函数传递文本。效果很好。


1
第二个模式存在一个问题,该模式本身完全匹配纯“ www.domain.com”。url中包含某种引荐来源网址时,就会出现问题,例如:&location = http%3A%2F%2Fwww.amazon.com%2FNeil-Young%2Fe%2FB000APYJWA%3Fqid%3D1280679945%26sr%3D8-2-ent&tag = tra0c7 -20&linkCode = ur2&camp = 1789&creative = 9325-在这种情况下,链接会再次自动链接。一种快速解决方案是在包含“ /”的否定列表后添加字符“ f”。因此,表达式为:replacePattern2 = /(^|[^\/f])(www\.[\S]+(\b|$))/gim
Redtopia

上面的代码对于边缘情况将无法通过很多测试。检测URL时,最好依靠专门的库。这就是为什么
Dan Dascalescu 2014年

2
我只是在一个字符串上运行了该字符串,其中某些Web链接确实已经具有href链接。在这种情况下,它无法弄乱现有的工作链接。
AdamJones 2014年

17

标识URL十分棘手,因为它们经常被标点符号包围,并且用户经常不使用完整的URL形式。存在许多用超链接替换URL的JavaScript函数,但是我找不到urlize在基于Python的Web框架Django中与过滤器一样工作的函数。因此,我将Django的urlize功能移植到了JavaScript:

https://github.com/ljosa/urlize.js

一个例子:

urlize('Go to SO (stackoverflow.com) and ask. <grin>', 
       {nofollow: true, autoescape: true})
=> "Go to SO (<a href="http://stackoverflow.com" rel="nofollow">stackoverflow.com</a>) and ask. &lt;grin&gt;"

第二个参数(如果为true)将导致rel="nofollow"插入。第三个参数(如果为true)将转义在HTML中具有特殊含义的字符。请参阅README文件


也可与html源一起使用,例如:www.web.com
<a href =“ https://://github.com”>

@Paulius:如果将选项设置django_compatible为false,它将更好地处理该用例。
Vebjorn Ljosa

Django urlize不正确支持TLD(至少不支持GitHub上的JS端口)。Ben Alman的JavaScript Linkify是可正确处理TLD的库。
Dan Dascalescu 2014年

添加了对检测具有其他顶级域的URL的支持,即使该URL不是以“ http”或“ www”开头。
Vebjorn Ljosa

10

我将Roshambo String.linkify()更改为emailAddressPattern以识别aaa.bbb。@ ccc.ddd地址

if(!String.linkify) {
    String.prototype.linkify = function() {

        // http://, https://, ftp://
        var urlPattern = /\b(?:https?|ftp):\/\/[a-z0-9-+&@#\/%?=~_|!:,.;]*[a-z0-9-+&@#\/%=~_|]/gim;

        // www. sans http:// or https://
        var pseudoUrlPattern = /(^|[^\/])(www\.[\S]+(\b|$))/gim;

        // Email addresses *** here I've changed the expression ***
        var emailAddressPattern = /(([a-zA-Z0-9_\-\.]+)@[a-zA-Z_]+?(?:\.[a-zA-Z]{2,6}))+/gim;

        return this
            .replace(urlPattern, '<a target="_blank" href="$&">$&</a>')
            .replace(pseudoUrlPattern, '$1<a target="_blank" href="http://$2">$2</a>')
            .replace(emailAddressPattern, '<a target="_blank" href="mailto:$1">$1</a>');
    };
}

上面的代码对于边缘情况将无法通过很多测试。检测URL时,最好依靠专门的库。这就是为什么
Dan Dascalescu 2014年

9

我在Google上搜索了任何更新的内容,然后遇到了这个问题:

$('p').each(function(){
   $(this).html( $(this).html().replace(/((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g, '<a href="$1">$1</a> ') );
});

演示: http : //jsfiddle.net/kachibito/hEgvc/1/

对于普通链接确实很好用。


什么是“普通链接”?在这里查看您的演示的分支:jsfiddle.net/hEgvc/27人们会发现并发现它们,并且可以轻松实现这一目的。根据RFC3986的规定,URI并非易事,如果您只想覆盖“常规链接”,我建议至少遵循此正则表达式:^(([[[^:/?#] +):)?(//([ ^ /?#] *))?([^?#] *)(\?([^#] *))?(#(。*))?
伊万

2
我的意思是格式http://example.com/folder/folder/folder/或其他格式的任何内容https://example.org/blah-只是您可以匹配95-99%用例的典型非疯狂URL格式。我将其用于内部管理区域,因此不需要任何花哨的功能即可捕获边缘情况或哈希链接。
退化


5

此解决方案与其他解决方案一样工作,并且实际上使用的解决方案与其中一个相同,但是代替返回HTML字符串,这将返回包含A元素和任何适用文本节点的文档片段。

 function make_link(string) {
    var words = string.split(' '),
        ret = document.createDocumentFragment();
    for (var i = 0, l = words.length; i < l; i++) {
        if (words[i].match(/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi)) {
            var elm = document.createElement('a');
            elm.href = words[i];
            elm.textContent = words[i];
            if (ret.childNodes.length > 0) {
                ret.lastChild.textContent += ' ';
            }
            ret.appendChild(elm);
        } else {
            if (ret.lastChild && ret.lastChild.nodeType === 3) {
                ret.lastChild.textContent += ' ' + words[i];
            } else {
                ret.appendChild(document.createTextNode(' ' + words[i]));
            }
        }
    }
    return ret;
}

有一些警告,即较旧的IE和textContent支持。

是一个演示。


2
@DanDascalescu而不是一概而论,也许可以提供您所说的优势案例。
rlemon

我需要吗?看一下URLComponent regexp。但是如果您坚持要反对本·阿尔曼(Ben Alman)的linkify测试套件。我确实开始提供失败的测试,例如用于urlize,但是很快意识到只有在认真的图书馆努力下才值得这样做。出于所有应有的尊重,上面的一个是StackOverflow的答案,而不是试图正确解析URL的开源库。
Dan Dascalescu 2014年

2
所以有一些极端的情况。精彩。这些答案可能仍然对其他人有用,一口气否决他们似乎过分地杀了他们。您已评论并看似已被否决的其他答案确实包含有用的信息(以及您的答案)。并非每个人都会反对上述案件,也不是每个人都希望使用图书馆。
rlemon

究竟。那些不了解正则表达式局限性的人是那些乐于从最受好评的答案中脱颖而出并运行它的人。这些是最应该使用图书馆的人。
Dan Dascalescu 2014年

1
但是,用非您喜欢的解决方案正则表达式拒绝所有答案的理由是什么呢?
rlemon 2014年

4

如果您需要显示较短的链接(仅域),但具有相同的长URL,则可以尝试修改上面发布的Sam Hasler的代码版本

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/([-A-Z0-9+&@#%?=~_|!:,.;]*)([-A-Z0-9+&@#%?\/=~_|!:,.;]*)[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp, "<a href='$1' target='_blank'>$3</a>");
}

3

Reg Ex: /(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig

function UriphiMe(text) {
      var exp = /(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig; 
      return text.replace(exp,"<a href='$1'>$1</a>");
}

以下是一些经过测试的字符串:

  1. 在www.google.com上找到我
  2. 万维网
  3. 找到我的网站www。http://www.com
  4. 跟随我:http : //www.nishantwork.wordpress.com
  5. http://www.nishantwork.wordpress.com
  6. 跟随我:http : //www.nishantwork.wordpress.com
  7. https://stackoverflow.com/users/430803/nishant

注意:如果您不想通过www有效的密码,只需在reg ex下方使用: /(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig


上面的代码对于边缘情况将无法通过很多测试。检测URL时,最好还是依赖专门的库。这就是为什么
Dan Dascalescu 2014年

3

应该注意有关URI复杂性的警告,但是对您的问题的简单回答是:
要替换每个匹配项,您需要/g在RegEx的末尾添加标志:
/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi


3
/**
 * Convert URLs in a string to anchor buttons
 * @param {!string} string
 * @returns {!string}
 */

function URLify(string){
  var urls = string.match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);
  if (urls) {
    urls.forEach(function (url) {
      string = string.replace(url, '<a target="_blank" href="' + url + '">' + url + "</a>");
    });
  }
  return string.replace("(", "<br/>(");
}

简单的例子


2

把事情简单化!说你不能拥有的,而不是你可以拥有的:)

如上所述,URL可能非常复杂,尤其是在“?”之后,并且并非所有URL都以“ www”开头。例如maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20

因此,与其拥有一个复杂的正则表达式,使其不能满足所有极端情况,并且将难以维护,不如这么简单的正则表达式在实践中对我来说很好。

比赛

http(s):// (anything but a space)+

www. (anything but a space)+

“一切” [^'"<>\s] ...基本上是贪婪的匹配,继续出现一个空格,引号,尖括号或行尾

也:

请记住要检查它是否不是URL格式,例如文本包含href="..."src="..."

添加ref = nofollow(如果适用)

该解决方案不如上面提到的库“好”,但是简单得多,并且在实践中效果很好。

if html.match( /(href)|(src)/i )) {
    return html; // text already has a hyper link in it
    }

html = html.replace( 
            /\b(https?:\/\/[^\s\(\)\'\"\<\>]+)/ig, 
            "<a ref='nofollow' href='$1'>$1</a>" 
            );

html = html.replace( 
            /\s(www\.[^\s\(\)\'\"\<\>]+)/ig, 
            "<a ref='nofollow' href='http://$1'>$1</a>" 
            );

html = html.replace( 
             /^(www\.[^\s\(\)\'\"\<\>]+)/ig, 
            "<a ref='nofollow' href='http://$1'>$1</a>" 
            );

return html;

2

具有国际域名和星体字符支持的正确URL检测不是一件容易的事。linkify-it库根据许多条件构建正则表达式,最终大小约为6 KB :)。它比当前接受的答案中引用的所有库更准确。

请参阅linkify-it演示以检查所有边缘情况并测试您的情况。

如果需要链接HTML源,则应首先对其进行解析,然后分别迭代每个文本标记。



0

我不得不做相反的事情,并且使HTML链接仅进入URL,但是我修改了您的正则表达式,它的工作原理很吸引人,谢谢:)

var exp = /<a\s.*href=['"](\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_ |!:,。;]] [[-A-Z0-9 +&@#\ /%=〜_ |])['“]。*>。* <\ / a> / ig;

source = source.replace(exp,“ $ 1”);

我看不到您的正则表达式的意义。它匹配一切,用一切替换一切。实际上,您的代码不执行任何操作。
乍得格兰特

8
我想我应该等待评论,以允许人们完成编辑。抱歉。
乍得格兰特

0

Travitron上面的答案中的电子邮件检测对我而言不起作用,因此我用以下代码(C#代码)对其进行扩展/替换。

// Change e-mail addresses to mailto: links.
const RegexOptions o = RegexOptions.Multiline | RegexOptions.IgnoreCase;
const string pat3 = @"([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,6})";
const string rep3 = @"<a href=""mailto:$1@$2.$3"">$1@$2.$3</a>";
text = Regex.Replace(text, pat3, rep3, o);

这允许使用电子邮件地址,例如“ firstname.secondname@one.two.three.co.uk ”。


上面的代码对于边缘情况将无法通过很多测试。检测URL时,最好还是依赖专门的库。这就是为什么
Dan Dascalescu 2014年

谢谢,@ DanDascalescu通常,将其概括化总是更好。
Uwe Keim

0

从多个来源输入后,我现在有了一个很好的解决方案。它与编写自己的替换代码有关。

回答

小提琴

function replaceURLWithHTMLLinks(text) {
    var re = /(\(.*?)?\b((?:https?|ftp|file):\/\/[-a-z0-9+&@#\/%?=~_()|!:,.;]*[-a-z0-9+&@#\/%=~_()|])/ig;
    return text.replace(re, function(match, lParens, url) {
        var rParens = '';
        lParens = lParens || '';

        // Try to strip the same number of right parens from url
        // as there are left parens.  Here, lParenCounter must be
        // a RegExp object.  You cannot use a literal
        //     while (/\(/g.exec(lParens)) { ... }
        // because an object is needed to store the lastIndex state.
        var lParenCounter = /\(/g;
        while (lParenCounter.exec(lParens)) {
            var m;
            // We want m[1] to be greedy, unless a period precedes the
            // right parenthesis.  These tests cannot be simplified as
            //     /(.*)(\.?\).*)/.exec(url)
            // because if (.*) is greedy then \.? never gets a chance.
            if (m = /(.*)(\.\).*)/.exec(url) ||
                    /(.*)(\).*)/.exec(url)) {
                url = m[1];
                rParens = m[2] + rParens;
            }
        }
        return lParens + "<a href='" + url + "'>" + url + "</a>" + rParens;
    });
}

2
上面的代码(以及通常的大多数正则表达式)将在边缘情况下无法通过大量测试。检测URL时,最好依靠专门的库。这就是为什么
Dan Dascalescu 2014年

丹,有这样的图书馆吗?尽管在这种情况下,我们仍然会匹配上面的正则表达式,以便当使用类似垃圾(即使另一个库将垃圾证明为有效的URL / URI)作为输入时,代码也永远不会输出垃圾。
Mike Mestnik,2015年


0

这是我的解决方案:

var content = "Visit https://wwww.google.com or watch this video: https://www.youtube.com/watch?v=0T4DQYgsazo and news at http://www.bbc.com";
content = replaceUrlsWithLinks(content, "http://");
content = replaceUrlsWithLinks(content, "https://");

function replaceUrlsWithLinks(content, protocol) {
    var startPos = 0;
    var s = 0;

    while (s < content.length) {
        startPos = content.indexOf(protocol, s);

        if (startPos < 0)
            return content;

        let endPos = content.indexOf(" ", startPos + 1);

        if (endPos < 0)
            endPos = content.length;

        let url = content.substr(startPos, endPos - startPos);

        if (url.endsWith(".") || url.endsWith("?") || url.endsWith(",")) {
            url = url.substr(0, url.length - 1);
            endPos--;
        }

        if (ROOTNS.utils.stringsHelper.validUrl(url)) {
            let link = "<a href='" + url + "'>" + url + "</a>";
            content = content.substr(0, startPos) + link + content.substr(endPos);
            s = startPos + link.length;
        } else {
            s = endPos + 1;
        }
    }

    return content;
}

function validUrl(url) {
    try {
        new URL(url);
        return true;
    } catch (e) {
        return false;
    }
}

0

尝试以下功能:

function anchorify(text){
  var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
  var text1=text.replace(exp, "<a href='$1'>$1</a>");
  var exp2 =/(^|[^\/])(www\.[\S]+(\b|$))/gim;
  return text1.replace(exp2, '$1<a target="_blank" href="http://$2">$2</a>');
}

alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));


0

尝试以下解决方案

function replaceLinkClickableLink(url = '') {
let pattern = new RegExp('^(https?:\\/\\/)?'+
        '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|'+
        '((\\d{1,3}\\.){3}\\d{1,3}))'+
        '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+
        '(\\?[;&a-z\\d%_.~+=-]*)?'+
        '(\\#[-a-z\\d_]*)?$','i');

let isUrl = pattern.test(url);
if (isUrl) {
    return `<a href="${url}" target="_blank">${url}</a>`;
}
return url;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.