JS:将JS对象格式化为php语法形式(完美支持无unicode编码匹配的正则)

javascript 复制代码
/**
 * 格式化Object数据为php语法形式
 * @param {*} obj 任意数据
 * @param {String} spaceLen 缩略符长度:必须在2~65536之间,否则默认为2
 * @return {String} 格式化后的PHP语法字符串
 */
function formatToPhp(obj, spaceLen) {
  formatToPhp = function (obj, spaceLen) {
    const space =
      spaceLen >= 2 && spaceLen <= 65536 ? ' '.repeat(spaceLen) : '  '
    return formatToPhp.fn(obj, '', (formatToPhp.space = space))
  }
  formatToPhp.toStr = function (scalar) {
    scalar = JSON.stringify(scalar).split('\'').join('\\\'')
    return '\'' + scalar.slice(1, -1) + '\''
  }
  formatToPhp.fn = function (obj, minSpace, maxSpace) {
    const t = typeof obj
    if (t === 'object') {
      const nextSpace = maxSpace + this.space
      switch (Object.prototype.toString.call(obj)) {
        case '[object Array]':
          return obj.length === 0
            ? '[]'
            : `[\n${maxSpace}${obj.map((item) => this.fn(item, maxSpace, nextSpace)).join(`,\n${maxSpace}`)}\n${minSpace}]`
        case '[object Object]':
          const keys = Object.keys(obj)
          return keys.length === 0
            ? '[]'
            : `[\n${keys.map((key) => maxSpace + this.toStr(key) + ' => ' + this.fn(obj[key], maxSpace, nextSpace)).join(',\n')}\n${minSpace}]`
        case '[object RegExp]':
          return '\'' + (obj + '').split('\'').join('\\\'') + '\''
      }
      return null
    } else if (t === 'string') return this.toStr(obj)
    return t === 'function' ? 'function(){}' : JSON.stringify(obj) || null
  }
  return formatToPhp(obj, spaceLen)
}

注意:正则在匹配unicode编码时需要手动修改。例如:

JS正则:/[\u4e00-\u9fa5]+/

PHP正则:/[\x{4e00}-\x{9fa5}]+/u

相关推荐
在角落发呆几秒前
跨越网络鸿沟:传统文件传输与现代内网穿透的奇妙交响
开发语言·php
Season4504 分钟前
C++之模板元编程(前置知识 constexpr)
开发语言·c++
坚定信念,勇往无前5 分钟前
electron-vite 安装better-sqlite3
javascript·数据库·electron
AI玫瑰助手6 分钟前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
@菜菜_达13 分钟前
jquery.inputmask插件介绍
前端·javascript·jquery
QuZhengRong13 分钟前
【Luck-Report】缓存
java·前端·后端·vue·excel
jiayong2318 分钟前
前端面试题库 - 浏览器与网络篇
前端·网络·面试
Csvn22 分钟前
小程序开发:微信小程序与 uni-app 实战指南
前端
摸鱼小李上线了29 分钟前
vue项目页面添加水印实现方法
前端·javascript·vue.js
计算机安禾29 分钟前
【c++面向对象编程】第40篇:单例模式(Singleton)的多种C++实现
开发语言·c++·单例模式