通过正则获取html中img的url,将其上传到自己的服务器,并生成新的url替换原图片url

需求:将其他网站的文章复制到自己网站的编辑器的时候,图片地址是别人网站的,这时候需要获取到图片资源上传到本地服务器,并替换掉img的url

replacePicturePath (html) {
  let imgArr = []
  // 此处matchStr匹配的img标签的整体内容,groups匹配的是img中src的url
  // imgArr是要当前html中要批量上传的图片地址
  html.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, (matchStr, groups, index, sourceStr) => {
    imgArr.push(groups)
    return matchStr
  })
  this.uploadImgs(imgArr, html)
},
uploadImgs (imgArr, html) {
  // 此处是由后台通过这些url获取到图片资源,再批量上传到我们的服务器,并返回生成的url
  uploadImgs(imgArr).then(res => {
    if (res.code === 0) {
      if (res.result && res.result.length > 0) {
        /**
         * res.result是用来到时候一一比对再做替换的图片数组对象,其中对象的数据结构是:
         * {
         *   primitiveVal: 图片的原始url,
         *   replaceVal: 图片上传之后生成的url
         * }
         */
        this.replaceImgUrl(html, res.result)
      } else {
        this.$message.warning('上传图片出错')
      }
    }
  }).catch(err => {
    this.$message.warning('上传图片出错')
  })
},
// 参数matchStr是每次正则匹配到的字符串,这是固定的
// 参数groups是正则表达式捕获组匹配到的内容。若正则表达式没有捕获组则没有该参数,groups加个s的意思是这边可能有多个分组
// 参数index是匹配项在字符串中的开始下标(注意不是数组的下标)
// 参数sourceStr则是原字符串
replaceImgUrl (html, arr) {
  let replaceHtml = html.replace(
    /<img [^>]*src=['"]([^'"]+)[^>]*>/gi,
    (matchStr, groups, index, sourceStr) => {
      let tempStr = ""
      arr.forEach((val) => {
        if (val.primitiveVal === groups) {
          tempStr = matchStr.replace(
            /src=[\'\"]?([^\'\"]*)[\'\"]?/i,
            `src="${val.replaceVal}"`
          )
          // 解决图片跨域问题
          tempStr = tempStr.replace('crossorigin="anonymous"', '')
        }
      })
      return tempStr ? tempStr : matchStr
    }
  )
  return replaceHtml
}

使用方法:(可将三个函数封装到一个外部js中再进行引用)

this.replacePicturePath(curHtml)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值