---
permalink: 2017/02/13/javascript/string-split-camelcase/
title: 字符串字符分割和驼峰形式的转换
tags:
    - PHP
date: 2017-02-13 18:38:45
categories:
    - PHP
---
## 前言

看到了 `Phalcon` 的 `Model` 用法，想在自己的框架里实现，便稍微研究了一番，原理还是蛮简单的。

`Phalcon` 提供了三种方法 `findBy`、`findFirstBy`、`countBy`，它使用魔术方法 `__callStatic` 来解析用户调用的方法。

例如：用户调用 `findFirstByUserMobile` 方法，`Phalcon` 会将其分割成 `findFirstBy` 和 `UserMobile`。接着会对 `UserMobile` 进行处理，转换成 `user_mobile`。这就是这篇文章的由来。

## 字符分割形式转换驼峰形式

这里主要是运用了 `ucwords` 的方法。

先将字符串转换为小写，再连接符号统统转换为空格，接着使用 `ucwords` 将每个单词的首字母改为大写，最后取出空格。

```php
// 这里主要是运用了ucwords的方法
function camelize($string, $separator = '_')
{
    // 将字符串转换为小写
    $string = strtolower($string);
    // 为了能够使用ucwords方法，将连接符号统统转换为空格
    $string = str_replace($separator, ' ', $string);
    // 将每个单词的首字母改为大写
    $string = ucwords($string);
    // 去除空格
    return str_replace(' ', '', $string);
}

echo camelize('terse_test'); // TerseTest
```

## 驼峰形式转换字符分割形式

这个方法比较巧妙，当初看见的时候，还赞叹了一番。

主要原理是在小写字母和大写字母之间加上连接符号，然后转换为小写。

```php
// 这个方法比较巧妙，当初看见的时候，还赞叹了一番
function uncamelize($string, $separator = '_')
{
    // 在小写字母和大写字母之间加上连接符号
    $string = preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $string);
    // 转换为小写
    return strtolower($string);
}

echo camelize('TerseTest'); // terse_test
```

`Laravel` 在处理字符串的时候使用的正则是 `~(?<=\\w)([A-Z])~` 后期仔细想了想，还是蛮有道理的，毕竟跟大写字母在一起的不一定是小写字母。

## 总结

刚开始在准备这个方法的时候，思路要比现在复杂多了。多看多思考，果然是有帮助的。