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

相关推荐
-凌凌漆-2 分钟前
【Qt】QStringLiteral 介绍
开发语言·qt
程序员爱钓鱼2 分钟前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
说码解字4 分钟前
Kotlin lazy 委托的底层实现原理
前端
gnip25 分钟前
总结一期正则表达式
javascript·正则表达式
军训猫猫头37 分钟前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
爱分享的程序员42 分钟前
前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
前端·javascript·node.js
翻滚吧键盘1 小时前
vue 条件渲染(v-if v-else-if v-else v-show)
前端·javascript·vue.js
vim怎么退出1 小时前
万字长文带你了解微前端架构
前端·微服务·前端框架
你这个年龄怎么睡得着的1 小时前
为什么 JavaScript 中 'str' 不是对象,却能调用方法?
前端·javascript·面试
真的想上岸啊1 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习