rich-text无法解析link标签

【微信小程序】无法解析京东商城商品详情富文本数据 -- 解决方案

小程序的rich-text富文本标签不支持link标签,这就导致我们从京东商城拿到的商品详情富文本无法解析。

rich-text组件用法

 

小程序商城对接京东商城商品,拿到的京东商品详情的富文本数据格式如下:

 

我们可以看到,拿到的商品详情并不是我们所想的img标签  而是通过link标签再次去请求css样式,可以看出上面有多个div,这也就是说明了图片是通过div当成背景图渲染出来的,我们来看看link的样式,看下图:

 

这就导致小程序无法解析京东的商品详情数据,我们直接来看解决办法,目前我想到的有两个解决方案,我们先来看最简单的第一个(我目前已经实现的方案)


第一方案:小程序实现的完整代码


 
 
  1. if(that.dataObj.warehouseContent){
  2. // 匹配link标签href属性的值
  3. let css = that.dataObj.warehouseContent.match( /<link.+?href=\'(.+?)\'.*>/)[ 1]
  4. wx.downloadFile({
  5. url: `https:${css}`, // 把京东的css下载到本地
  6. success (res) {
  7. if (res.statusCode === 200) {
  8. // 读取本地文件内容
  9. wx.getFileSystemManager().readFile({
  10. filePath:res.tempFilePath, // 本地css文件地址
  11. encoding: 'utf8', // 通过utf8解析
  12. success(data){
  13. if(!data.data){
  14. return
  15. }
  16. // 匹配url的内容 匹配出来的格式是---> url(xxx.jpg)
  17. let matchData = data.data.match( /url\((.+?)*\)/g )
  18. let imgs = ''
  19. for( let matchDataIndex in matchData){
  20. // 去掉‘url(’,转换后的格式是---> xxx.jpg)
  21. let oneSubstr = matchData[matchDataIndex].substr( 4)
  22. // 去掉最后的)括号 转换后的格式是---> xxx.jpg
  23. let twoSubstr = oneSubstr.substr( 0,oneSubstr.length -1)
  24. // 然后把图片url拼接到img标签上 转换后的格式是---> <img style="width:100%;" src="xxx.jpg">
  25. imgs+= `<img style="width:100%;" src="${twoSubstr}">`
  26. }
  27. that.dataObj.warehouseContent = that.dataObj.warehouseContent + imgs
  28. that.$apply()
  29. },
  30. fail(err){
  31. console.log( 'err',err)
  32. }
  33. })
  34. }
  35. }
  36. })
  37. }

上面是实现功能的完整代码

 

下面是对代码的分析

that.dataObj.warehouseContent是京东商品详情富文本内容,我们先通过正则表达式解析把link标签的href属性值解析出来(变量:css),然后下载(wx.downloadFile)京东的css样式文件到本地,不懂wx.downloadFile怎么使用的可以移步到微信小程序官方api文档

点击了解:wx.downloadFile使用方法

 

res.tempFilePath是css文件下载到本地文件所在的位置,再通过文件管理器读取本地文件内容,我们需要读取css文件的样式内容


 
 
  1. wx.getFileSystemManager().readFile({
  2. filePath:res.tempFilePath, // 本地css文件地址
  3. encoding: 'utf8', // 通过utf8解析
  4. success(data){
  5. console.log( '拿到css文件内容:',data.data)
  6. },
  7. fail(err){
  8. console.log( 'err',err)
  9. }
  10. })

关于文件管理器(wx.getFileSystemManager)的用法请移步到微信小程序官方api:点击了解:wx.getFileSystemManager使用方法

data.data是我们的样式内容,这个时候我们使用正则把图片url匹配下来,重新拼接到img标签上:


 
 
  1. // 匹配url的内容 匹配出来的格式是---> url(xxx.jpg)
  2. let matchData = data.data.match( /url\((.+?)*\)/g )
  3. let imgs = ''
  4. for( let matchDataIndex in matchData){
  5. // 去掉‘url(’,转换后的格式是---> xxx.jpg)
  6. let oneSubstr = matchData[matchDataIndex].substr( 4)
  7. // 去掉最后的)括号 转换后的格式是---> xxx.jpg
  8. let twoSubstr = oneSubstr.substr( 0,oneSubstr.length -1)
  9. // 然后把图片url拼接到img标签上 转换后的格式是---> <img style="width:100%;" src="xxx.jpg">
  10. imgs+= `<img style="width:100%;" src="${twoSubstr}">`
  11. }
  12. // 处理好的图片数据重新赋值回去
  13. that.dataObj.warehouseContent = that.dataObj.warehouseContent + imgs

如果有不理解的可以看看我在代码上面写的注释,或者在下方评论。


方案二(还未实践,稍微复杂,但是实现的最终效果一样)

我们知道,小程序rich-text组件并不支持link标签和style标签,我尝试过下载京东的样式文件到本地,通过<sytle>这里插入京东的样式文件</style>,然后拼接到富文本内,但是这个方法并不可行,因为小程序rich-text组件不支持style标签,但是还有一种稍微复杂的方案,我们用正则匹配把每个类名对应花括号里面的样式解析下来,然后再渲染进div标签的style属性内,这种方式是可行的,但是会复杂一些,我们来看一下结构


 
 
  1. .ssd-module-wrap .ssd-module,
  2. .ssd-module-wrap .ssd-module-heading {
  3. width: 640px;
  4. position: relative;
  5. overflow: hidden;
  6. }

 
 
  1. <div class="ssd-module" style="width: 640px;position: relative;overflow: hidden;"> </div>
  2. <div class="ssd-module-heading" style="width: 640px;position: relative;overflow: hidden;"> </div>

目前想到实现的方式就这两种,希望能帮助到你们!

另外你们可以关注下我的微信个人公众号“程序员小鸿”,有什么问题直接来公众号留言扣我哟!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值