使用JavaScript检查字符串中是否包含URL

10

我想使用JavaScript检查字符串是否包含URL,我从Google获取了以下代码

        if(new RegExp("[a-zA-Z\d]+://(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?").test(status_text)) {
          alert("url inside");
        }
但是这种方法仅适用于像"http://www.google.com""http://google.com" 这样的网址,而对于"www.google.com"则无效。我还想从字符串中提取该网址,以便处理该网址。

@Pumbaa80:不,我的问题有点不同,我的输入可以是纯字符串、仅网址或文本和网址混合。 - www.amitpatil.me
5个回答

26

尝试:

if(new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?").test(status_text)) {
        alert("url inside");
}

这个代码能够工作,但是我希望它能在用户完整输入URL后才显示提示信息,而不是在输入"http://www.go"时就触发。顺便提一下,我正在使用keyup事件来实现检测。 - www.amitpatil.me
1
@AmitPatil 使用文本框的模糊事件,而不是keyup事件,Sudhir的答案似乎没有提取该URL。顺便说一句。 - yjshen
你可以使用模糊事件,这样一旦焦点从文本框中失去,就可以运行代码... - Sudhir Bastakoti
是的,这就是我最后想到的诀窍,但我希望在keyup事件上使用它的原因是...每当我检测到URL时,我想触发ajax调用以提取URL的详细信息,同时用户可以继续输入...就像Facebook状态一样。 - www.amitpatil.me

3

对于我来说,Sudhir的答案与URL的结尾匹配。

这是我的正则表达式,用于防止匹配超出URL的结尾。

var str = " some text http://www.loopdeloop.org/index.html aussie bi-monthly animation challenge site."
var urlRE= new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?([^ ])+");
str.match(urlRE)

使用node.js生成了此输出:

[ 'http://www.loopdeloop.org/index.html',
'http://',
 undefined,
'www.loopdeloop.org',
 undefined,
'l',
index: 11,
input: ' some text http://www.loopdeloop.org/index.html aussie bi-monthly animation challenge site.' ]

1
您可以修改正则表达式以有条件地匹配URL的方案,方法如下:
var urlCheck = new RegExp('([a-zA-Z\d]+://)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?', 'i')
if (urlCheck.test(status_text) {
    console.log(urlCheck.exec(status_text));
}

1
var reg = new RegExp('([a-zA-Z\d]+://)?((\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?)', 'i')
if (reg.test(status_text)) {
    alert(reg.exec(status_text)[2]);
}

0

试一下这个

(?<http>(http:[/][/]|www.)([a-z]|[A-Z]|[0-9]|[/.]|[~])*)

我认为在这里单独匹配 www 并不是必要的。 - YMMD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接