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

相关推荐
我是伪码农4 小时前
Vue 智慧商城项目
前端·javascript·vue.js
不认输的西瓜4 小时前
fetch-event-source源码解读
前端·javascript
用户39051332192884 小时前
前端性能杀手竟然不是JS?图片优化才是绝大多数人忽略的"降本增效"方案
前端
一晌小贪欢4 小时前
Python 爬虫进阶:如何利用反射机制破解常见反爬策略
开发语言·爬虫·python·python爬虫·数据爬虫·爬虫python
阿猿收手吧!4 小时前
【C++】异步编程:std::async终极指南
开发语言·c++
朱昆鹏4 小时前
开源 Claude Code + Codex + 面板 的未来vibecoding平台
前端·后端·github
lyrieek4 小时前
pgadmin的导出图实现,还在搞先美容后拍照再恢复?
前端
永远是我的最爱4 小时前
基于.NET的小小便利店前台收银系统
前端·sqlserver·.net·visual studio
从文处安4 小时前
「九九八十一难」第一难:前端数据mock指南(TS + VUE)
前端
小程故事多_804 小时前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc