node.js 批量替换a标签跳转链接

为客户临时赶得一个页面,为了方便,从网上下载的模板。在样式上和跳转上做了修改,暂时顶用

  1. 需求

    主要是a标签的href
    1 外链的跳转,修改为自己的网址
    2 相对路径跳转,不做修改
    3 # 或者 javascript:;不做修改

  2. 确定了这些,接下来就好做了,原本是计划写一个正则,直接匹配a标签的内容,将这几个条件去除掉,但是正则功力有限,加上想到了前两天写的小爬虫,决定用node试一试,核心代码如下:

const fs = require('fs')
const cheerio = require('cheerio')
const pathName = './'
const fileOption = {
     
  encoding: 'utf-8'
}
let fileList = {
     }
// 读取当前目录所有文件
fs.readdir(pathName, function(err, files) {
     
  if (err) return
  for (let file of files) {
     
    let fileClass = file.split('.')
    let fileType = fileClass[fileClass.length - 1]
    if (fileType == 'html') {
     
      // 日志
      fileList[fileClass[0]] = []
      // 读取文件
      fs.readFile(pathName + file, fileOption, (error, data) => {
     
        if (error) return
        setHtml(data, file)
      })
    }
  }
})
// 设置html
function setHtml(html, fileName) {
     
//将html字符串转换为jsdom 方便操作
  let $ = cheerio.load(html, {
      decodeEntities: false })

  $('a').each(function name(i, v) {
     
    let _href = $(v).attr('href')
    let _replaceHref = replaceHref(_href)
    if (_href && _replaceHref) {
     
      // 日志记录
      fileList[fileName.split('.')[0]].push(
        _href + '  替换为=====>>>>>>   ' + _replaceHref
      )
      // 替换href
      $(v).attr('href', _replaceHref)
    }
  })
  fs.writeFile(pathName + fileName, $.html(), 'utf-8', function(error) {
     
    if (error) {
     
      console.log('写入失败')
    } else {
     
      console.log(fileName, '替换链接成功')
    }
  })
  // 存储写入日志
  fs.writeFile('./log.js', JSON.stringify(fileList), fileOption, function(
    params
  ) {
     })
}
// 替换链接
function replaceHref(href) {
     
  if (/(^\.\/|^\/)/.test(href) || href == '#' || href == 'javascript:;') {
     
    // 如果是./ 或 /开头的页面 或者是 # 或者 javascript:; 不操作
    return false
  } else if (/saas/.test(href)) {
     
    return false
  }
  return 'https://www2.smartwork.link/manager/#/myMeet'
}

核心部分已经做了注释,今天是1024程序节,祝各位程序猿们节日快乐!

你可能感兴趣的:(随手记论文,node,批量替换文件内容)