在JavaScript中如何从字符串中隔离提取出纯URL地址
从文本中提取URL的实现方案
你现有正则已经可以完成URL特征匹配,只需将test()校验方法替换为字符串的match()方法即可提取匹配结果,如需匹配文本中所有URL,给正则添加g全局修饰符即可。
基础实现(提取全文所有URL)
const msgContent = Msg.content // 正则添加g修饰符开启全局匹配 const urlRegex = /([a-zA-Z0-9]+:\/\/)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\.[A-Za-z]{2,4})(:[0-9]+)?(\/.*)?/g // 匹配结果为URL数组,无匹配时返回null const urlList = msgContent.match(urlRegex) if (urlList) { // 遍历处理提取到的所有URL urlList.forEach(url => { console.log(url) }) }
适配标签场景的实现
如果你的输入文本和示例一致,URL都包裹在<a>标签内部,可先提取a标签文本再做URL校验,避免重复匹配到href属性内的相同URL:
const msgContent = Msg.content const aTagRegex = /<a[^>]*>([^<]*)<\/a>/g const urlList = [] let matchResult // 遍历匹配所有a标签 while ((matchResult = aTagRegex.exec(msgContent)) !== null) { const aText = matchResult[1] // 校验a标签文本是否为URL if (/([a-zA-Z0-9]+:\/\/)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\.[A-Za-z]{2,4})(:[0-9]+)?(\/.*)?/.test(aText)) { urlList.push(aText) } } console.log(urlList)
优化建议
如果你的场景中URL固定为http/https协议,可将正则开头的([a-zA-Z0-9]+:\/\/)?替换为(https?:\/\/),可大幅降低非URL内容被误匹配的概率。
内容的提问来源于stack exchange,提问作者Jackson F
相关产品推荐
相关产品推荐

