正则实例---利用正则处理带标签的非标准JSON字符串

首先描述一下我要处理的数据格式:对方是用trs做的,提供过来的数据,是一个字符串。由于沟通不方便,只能这边自己处理。上图吧,看看这让人头疼的数据:

描述思路

  • 1.首先,我要拿到我的列表数据,先要把底部的"page"这些字符串移除掉,让我的数据看起来舒服些
  • 2.我要把回车和换行都去掉。回车和换行都是处理标签排列,这些去掉并不影响最终都展示效果。
  • 3.数组拆分。现在留下都只是个数组样式都字符串,我要将它拆成多个item,以便循环处理。
  • 4. 双引号处理:这是非常关键都一步。因为这些双引号都存在,让我没办法用JSON.parse(),因为他们不再是标准都json格式字符串。 这时候,需要将双引号\" 变成 \\\" ,说简单点,就是把这些带双引号的部分,转成纯粹的字符串。
  • 5.JSON.parse()转义json对象
  • 6.数据补全

这里,因为没有办法直接转成json对象,所以我就没有办法拿到TEXT 中的数据,所以我的思路是,通过正则把TEXT中的数据拿出来,然后进行格式处理。之后将json字符串中的TEXT删掉,转义之后重新赋值。

因为我是要做移动端分页,他们没有返回给我总条数,所以我只能通过判断是否有下一页,来确定时候还能进一步获取数据。

基本上是用正则来回拼接。主要思路就是,如果有带引号的标签,直接JSON.parse处理不了,得用正则提出来将引号转义,然后再放回去

export const formatNewsData  = function (str) {
    /* eslint-disable */
    // let _match= _str.match(/\[[\s\S]*\]\s*\"page\"/g)[0]
    // let result = _match.substring(0,_match.length - 6)
    let _newStr = str.replace(/][\s]*"page":[\s\S]*/, ']')
    _newStr = _newStr.replace(/[\r\n]/g,"")
    let _arr = _newStr.split('},')
    let nextHrefReg = /\< a[\s\S]{15,80}下一页\<\/a\>/g
    let nextHrefPre = str.match(nextHrefReg)
    let canLoadMore =nextHrefPre && nextHrefPre.length > 0
    let finnalArr = []
    let _arrNew = []
    _arr.forEach((item, index) => {
        let str = item
        if (index === 0){
            str = item.substring(1, item.length)
        }
        str += '}'
        _arrNew.push(str)
    })
    _arrNew.pop()
    _arrNew.forEach(item => {
        var _json = ''
        try {
            let textStr = item.match(/\"TEXT\"\:\"[\s\S]*\"\,\"url\"/)
            textStr = textStr[0].substring(8, textStr[0].length-7)
            textStr.replace("\"","\\\"")
            textStr = textStr.replace(/\< img[\s]*src\=\"\./,"< img src\=\"http:\/\/1.11.111.111\/pub\/aaq\/aa\/aa") let itemStr = item.replace(/\"TEXT\"\:\"[\s\S]*\"\,\"url\"/, "\"url\"") _json = JSON.parse(itemStr) _json.TEXT = textStr finnalArr.push(_json) } catch (e) { console.log('格式转换错误') } }) /* eslint-enable */ return { list: finnalArr, canLoadMore: canLoadMore } }

随机浏览