0

你能更新我的正则表达式以符合下一个要求吗

  • 必须匹配没有 www 和 http 的 url
  • 如果查询包含 - 也匹配
  • Url 在空格或逗号(,)或字符串结尾相遇时结束
  • 仅与列表中的 TopLevelDomains 匹配

    var srg = new RegExp(/(^|[\s])([\w\.]+\.(com|cc|net))/ig);
    

对于样本,必须匹配:

jsfiddle.net
jmitty.cc:8080/test3s.html
www.ru,sample.com,google.com/?l=en
very.secure.dotster.com/i?ewe

结果我需要

<a>jsfiddle.net</a>
<a>jmitty.cc:8080/test3s.html</a>
<a>www.ru</a>,<a>sample.com</a>,<a>google.com/?l=en</a>
<a>very.secure.dotster.com/i?ewe</a>

小提琴http://jsfiddle.net/tYnU7/

4

3 回答 3

0

好吧,我想你可以在你的正则表达式中改变一些小东西:

([\w\.]+\.(?:com|cc|net|ru)[^,\s]*)

替换为:

<a href="$1" target="_blank">$1</a>

我不知道你为什么(^|[\s])一开始就有,它对我来说似乎没有用,所以我把它删除了。如果你有你的理由,你可以把它放回去。

我根据您的需要添加ru到扩展名以匹配www.ru并添加[^,\s]*以继续匹配,直到遇到逗号或空格。

你更新的小提琴在这里

于 2013-08-23T16:57:13.380 回答
0

这是一个非常复杂的问题,没有完美的答案,但如果您不需要完美,请查看 Jeff Roberson 的Linkify页面和Van Goyvaerts 的这篇文章,讨论 Jeff Atwood 的博客文章“URL 的问题”。

于 2013-08-23T16:57:18.507 回答
0
/
  (?:^|\b)             # match word boundary or beginning of line
  (                    # begin cpature
    [\w.]+               # domain part
    \.[a-z]{2,3}         # domain suffix
    (?:\:[0-9]{1,5})?    # optional port
    (?:\/.*)?            # path details
  )                    # end capture
  (?:[,\s]|$)          # comma, space or eol
/ig

一些细节:

  • [\w.]+可能需要更多的工作,具体取决于您将什么归类为可接受的域字符(我听说他们现在正在接受 unicode 字符?)
  • 您可以更改[a-z]{2,3}为可接受的顶级域列表(例如(?:com|org|net|info|edu)。在您的示例中,您仅列出 com、cc 和 net,但您的结果显示www.ru为已捕获。
  • (?:\/.*)?默认情况下是贪婪的,但应该没问题,因为您需要查询信息。

还有小提琴

哦,如果您希望您的链接可点击(因为没有协议的链接不起作用):

var r = t.replace(srg, function(match,b,m,e){
    return b + '<a href="'+ (m.indexOf('http') == -1 ? 'http://' : '') + m + '">' + m + '</a>' + e;
});

这里展示

于 2013-08-23T16:57:21.590 回答