获取多个有标签文字的位置/给多个指定位置文字包上标签

应用场景:一段文字中的多个文字有包上标签,需要拿到包上标签文字起始位置的下标,位置不含标签。

实现思路:正则匹配到每个包上标签的的文字,依次减去前面有包标签的长度即可

 <div className='txt'>这是<em>一段要获取</em>包有<em>标签</em>文字<em>位置</em>的句子</div>

  const getTxtIndex = () => {
    let newPoint = []
    const el = document.getElementById('txt')||''
    let pattern = /<(\em)[^>]*>((.*?)<\/\1>)/g 
    let i = 0
    let m
    while ((m = pattern.exec(el.innerHTML)) != null) {
      let start = m.index - i
      let end = start + m[3].length
      i += 9 //<em></em>标签字符的长度
      newPoint.push({content: m[3],start,end}) // 获取的是去除标签的起始位置的下标
    }
    return newPoint
  }

  getTxtIndex() //

应用场景:给一段文字中的其中文字高亮,只有文字的起始位置的下标。

实现思路:当包上第一个标签后,文字的位置就会发生变化,后面再包位置就会不准,较简单的实现思路是先将位置倒序排序,从后往前包即可

const txtAddTag = (list = [], innerHTML = '') => {
  list = list.sort((a, b) => b.start - a.start) //倒序 从后往前包标签更方便
  for (let item of list) {
    let { start, end } = item
    let before = innerHTML.substring(0, start)
    let hitContent = innerHTML.substring(start, end)
    let after = innerHTML.substring(end, innerHTML.length)
    innerHTML = before + '<em>' + hitContent + '</em>' + after
  }
  return innerHTML
}

const list = [{ start: 1, end: 4 }, { start: 6, end: 8 }, { start: 13, end: 16 }]
txtAddTag(list, '这是一段要给指定位置的文字包上标签的句子')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值