JavaScript提取html页面的链接和标题

给定如下html代码,从代码中提取pathname的值和标题,返回由标题title和链接link组成的集合。

let str = `<Collapse>
<Collapse.Title className='wan-top-border'>
  订单管理
</Collapse.Title>
<Collapse.Body>
  <NavLink>
    <Link to={{ pathname: '/delete/order' }} test='1'>
      删除订单
    </Link>
  </NavLink>
  <NavLink>
    <Link to={{ pathname: '/add/order' }}>
      新增订单
    </Link>
  </NavLink>
</Collapse.Body>
</Collapse>
<Collapse>
<Collapse.Title className='wan-top-border'>
  商家管理
</Collapse.Title>
<Collapse.Body>
  <NavLink>
    <Link to={{ pathname: '/delete/vendoer' }} test='1'>
      删除商家
    </Link>
  </NavLink>
  <NavLink>
    <Link to={{ pathname: '/add/vendoer' }}>
      新增商家
    </Link>
  </NavLink>
</Collapse.Body>
</Collapse>
`

实现

function parser(str) {
  let i = 0;
  let list = []
  while (i < str.length) {
    let space = /\s/
    let char = str[i]
    if (space.test(char)) {
      i++;
      continue
    }
    if (char === '<') {
      let name = ''
      let props = ''
      let isFirst = true
      i++
      if (str[i] == '/') {
        while (str[i] !== '>') {
          i++;
        }
        i++;
        continue
      }
      while (i < str.length && str[i] !== '>') {
        if (space.test(str[i])) {
          isFirst = false
          i++
          continue
        }
        if (isFirst) {
          name += str[i++];
        }
        else {
          while (str[i] != '>') {
            props += str[i]
            i++
          }
        }

      }
      i++;
      let label = ''
      while (i < str.length && str[i] != '<') {
        if (space.test(str[i])) {
          i++
          continue;
        }
        label += str[i];
        i++;
      }
      list.push({
        name,
        props,
        label
      })
      continue
    }
  }
  return list
}
let result = parser(str)
function transfer(list = []){
  let res = []
  list.forEach((item)=>{
    if(item.name == 'Link'){
      let title = item.label
      let prop = item.props
      let linkReg = /pathname:\s?'([\w\/]+)'/
      let link = prop.match(linkReg)
      res.push({
        title,
        link:link[1]
      })
    }
  })
  return res;
}
let transofrm = transfer(result)
console.log(JSON.stringify(transofrm),null,2);

结果

[
  {
    "title": "删除订单",
    "link": "/delete/order"
  },
  {
    "title": "新增订单",
    "link": "/add/order"
  }
]

[Done] exited with code=0 in 0.417 seconds

[Running] node "/Users/sundingjia/Downloads/debug-react-source-code-16.14.0/p.js"
[
  {
    "title": "删除订单",
    "link": "/delete/order"
  },
  {
    "title": "新增订单",
    "link": "/add/order"
  },
  {
    "title": "删除商家",
    "link": "/delete/vendoer"
  },
  {
    "title": "新增商家",
    "link": "/add/vendoer"
  }
]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值