匹配出一段字符串中的url

例如这段语句: 'hi avator https://baidu.com this is a test link ok google.cn ds www.baidu.com qweqw baidu.app';
匹配出:

https://baidu.com
google.cn
www.baidu.com
baidu.app

类似这四种网址,谢谢

阅读 2k
4 个回答
function checkURL(url){
        //url= 协议://(ftp的登录信息)[IP|域名](:端口号)(/或?请求参数)
        let strRegex = '^((https|http|ftp)://)?'//(https或http或ftp):// 可有可无
            + '(([\\w_!~*\'()\\.&=+$%-]+: )?[\\w_!~*\'()\\.&=+$%-]+@)?' //ftp的user@  可有可无
            + '(([0-9]{1,3}\\.){3}[0-9]{1,3}' // IP形式的URL- 3位数字.3位数字.3位数字.3位数字
            + '|' // 允许IP和DOMAIN(域名) 
            + '(localhost)|'    //匹配localhost
            + '([\\w_!~*\'()-]+\\.)*' // 域名- 至少一个[英文或数字_!~*\'()-]加上.
            + '\\w+\\.' // 一级域名 -英文或数字  加上.
            + '[a-zA-Z]{1,6})' // 顶级域名- 1-6位英文 
            + '(:[0-9]{1,5})?' // 端口- :80 ,1-5位数字
            + '((/?)|' // url无参数结尾 - 斜杆或这没有
            + '(/[\\w_!~*\'()\\.;?:@&=+$,%#-]+)+/?)$';//请求参数结尾- 英文或数字和[]内的各种字符
        
        var strRegex1 = '^(?=^.{3,255}$)((http|https|ftp)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/)?(?:\/(.+)\/?$)?(\/\w+\.\w+)*([\?&]\w+=\w*|[\u4e00-\u9fa5]+)*$'
        var re = new RegExp(strRegex,'i') //i不区分大小写
        //将url做uri转码后再匹配,解除请求参数中的中文和空字符影响
        if (re.test(encodeURI(url))) {
            return true
        } else {
            return false
        }
    }

let str = 'hi avator https://baidu.com this is a test link ok google.cn ds www.baidu.com qweqw baidu.app'
let strArr = str.split(' ')
let result = strArr.filter(x => checkURL(x))
console.log(result) // ['https://baidu.com', 'google.cn', 'www.baidu.com', 'baidu.app']

image.png

'hi avator https://baidu.com this is a test link ok google.cn ds www.baidu.com qweqw baidu.app'
    .match(/(https?:\/\/)?(\w+\.)+\w+/g)

会有误伤。

var reg = /\S*?\.(?:com|cn|app)/g;
'hi avator https://baidu.com this is a test link ok google.cn ds www.baidu.com qweqw baidu.app'.match(reg)

一个可能的匹配规则:

RE=/(?<=^|\s)((\w+:\/\/)?(\S+\.)+\w+)(?=\s|$)/g

稍微解释一下,就是匹配左边要么是开头,或者空格;右边要么是空格或者结尾,中间由多个由.连起来的连续非空字符和最后多个字母符,前面还可以有普通字符构成的协议名称。它可以正确匹配:

STR1="hi avator https://baidu.com this is a test link ok google.cn ds wwww.baidu.co_m qweqw baidu.app" // 匹配出  https://baidu.com  google.cn wwww.baidu.co_m baidu.app

STR2="hi avator htt1ps://bai-du.com this is a test link ok g_oo2gle.cn ds wwww.baidu.co-m qweqw bai-du.app" // 匹配出 htt1ps://bai-du.com g_oo2gle.cn bai-du.app

STR3="hi avator htt-ps://bai-du.com this is a test link ok g_oo2gle.cn ds wwww.baidu.co-m qweqw bai-du.app" // 匹配出 g_oo2gle.cn bai-du.app

注意,\w可以匹配大小写字母,数字和下划线,不匹配中划线。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题