首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:WWW,nonWWW,HTTP,nonHTTP

:WWW,nonWWW,HTTP,nonHTTP
EN

Stack Overflow用户
提问于 2011-05-18 00:35:51
回答 1查看 532关注 0票数 0

我正努力尝试将链接与"www“/ "http”连接起来

这就是我得到的:

代码语言:javascript
复制
        noProtocolUrl = /\b((?:www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/g,
    httpOrMailtoUrl = /\b((?:[a-z][\w-]+:)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,
        linkifier = function (html) {
            return FormatLink(html
                        .replace(noProtocolUrl, '<a href="<``>://$1" rel="nofollow external" class="external_link">$1</a>')  // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive
                        .replace(httpOrMailtoUrl, '<a href="$1" rel="nofollow external" class="external_link">$1</a>')
                        .replace(/"<``>/g, '"http'));  // reinsert `"http`

它工作得很好,除了使用http:// are的简单链接获得了两次linkify处理。

http://google.com将成为两个链接:htttp://http://google.com

知道怎么解决这个问题吗?

谢谢!

编辑

嗯,除了没有的链接(http*和**www,比如bit.ly/foo )之外,我让它对任何链接都有效。

如果有人也知道如何捕捉这些链接,欢迎您。

代码语言:javascript
复制
var noProtocolUrl = /(^|["'(\s]|&lt;)(www\..+?\..+?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g,
httpOrMailtoUrl = /\b((?:[a-z][\w-]+:)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi,
linkifier = function ( html ) {
    return FormatLink(html
                .replace( noProtocolUrl, '$1<a href="<``>://$2" rel="nofollow external" class="external_link">$2</a>$3' )  // NOTE: we escape `"http` as `"<``>` to make sure `httpOrMailtoUrl` below doesn't find it as a false-positive
                .replace( httpOrMailtoUrl, '<a href="$1" rel="nofollow external" class="external_link">$1</a>' )
                .replace( /"<``>/g, '"http' ));  // reinsert `"http`
  },
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-19 18:53:11

使用

代码语言:javascript
复制
var noProtocolUrl = /(^|["'(\s]|&lt;)((?:[a-z0-9-]+\.)+(?:ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|asia|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jobs|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mobi|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|travel|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xxx|ye|yt|za|zm|zw)(?:\/[a-zA-Z0-9_][^\s]*)?)((?:[:?]|\.+)?(?:\s|$)|&gt;|[)"',])/g,

在你的密码里。

大量的替代方案是iana的权威tlds列表,用于终止url的服务器部分。这并不是绝对必要的,但在链接任意文本时,减少误报的数量可能是很方便的。

另一个修改是第二个引用子表达式的补充,即.

代码语言:javascript
复制
(?:\/[a-zA-Z0-9_][^\s]*)?

它匹配一个可选路径,并可能匹配查询和片段标识符-实际上,直到字符串末尾或第一个空白字符为止的所有内容。

您可能希望了解一下RFC 3986,它定义了uris的正式语法。根据本文档中的规范构建正则表达式,将方案部分标记为可选匹配应该会将匹配的正则表达式转换为更健壮的解决方案--但是,如果没有那么高的精度,您可能会相处得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6038681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档