php 把驼峰样式的字符串转换成下划线样式的字符串
1、如何在php中把驼峰样式的字符串转换成下划线样式的字符串。例:输入是FooBar的话,输出则是foo_bar
以下是用正则的方式去完成,既然用到正则,方法肯定就不只一种,我们看下下面的方式
echo strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', 'fooBar'));
//output:foo_bar
echo "<br>";
echo strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', 'foo'));
//output:foo
echo "<br>";
echo strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', 'fooBarB'));
//output:foo_bar_b
echo "<br>";
下面我们来解释下,上面正则的意思。具体正则的基本知识,这里篇幅有限就不具体介绍了,文章末尾会放出几篇写的比较好的正则表达式的文章。
上面的正则里面主要用到了正则表达式中的环视边界匹配的语法。具体定义如下(摘抄):
环视的字面意思就是左右看看,需要左右符合一些条件,本质上,它也是匹配边界,对边界有一些要求,这个要求是针对左边或右边的字符串的,根据要求不同,分为四种环视:
- 肯定顺序环视,语法是(?=...),要求右边的字符串匹配指定的表达式,比如表达式abc(?=def),(?=def)在字符c右面,即匹配c右面的边界,对这个边界的要求是,它的右边有def,比如abcdef,如果没有,比如abcd,则不匹配;
- 否定顺序环视,语法是(?!...),要求右边的字符串不能匹配指定的表达式,比如表达式s(?!ing),匹配一般的s,但不匹配后面有ing的s;
- 肯定逆序环视,语法是(?<=...),要求左边的字符串匹配指定的表达式,比如表达式(?<=\s)abc,(?<=\s)在字符a左边,即匹配a左边的边界,对这个边界的要求是,它的左边必须是空白字符;
- 否定逆序环视,语法是(?<!...),要求左边的字符串不能匹配指定的表达式,比如表达式(?<!\w)cat,(?<!\w)在字符c左边,即匹配c左边的边界,对这个边界的要求是,它的左边不能是单词字符。
可以看出,环视也使用括号(),不过,它不是分组,不占用分组编号。
继续回到我们上面的正则表达式,第一个小括号(?<=[a-z]),这是肯定逆序环视的语法,要求匹配的字符串的左边必须有小写的字母。第二个小括号则是一个分组,匹配大写的字母,注意正则中的分组编号是从1开始的,这和我们传统编程下标一般是从0开始不同。而第一个小括号本身就是语法,其不占用分组编号,所以后面的$1,则是匹配的第二个小括号中的内容,并将其前面添加一个_符号,最后再整体将整个字符串转换成小写。
既然我们已经能把驼峰法转为下划线的样式了,如果反过来又该怎办呢?
2、如何在php中把下划线样式的字符串转换成驼峰样式的字符串。例:输入是foo_bar的话,输出则是FooBar
$str = preg_replace_callback('/_+([a-z])/',function($matches){
print_r($matches); //Array ( [0] => _b [1] => b )
return strtoupper($matches[1]);
},'foo_bar');
echo $str; //fooBar
echo "<br>";
$str = preg_replace_callback('/_+([a-z])/',function($matches){
return strtoupper($matches[1]);
},'foo');
echo $str; //foo
echo "<br>";
$str = preg_replace_callback('/_+([a-z])/',function($matches){
return strtoupper($matches[1]);
},'foo_bar_b');
echo $str; //fooBarB
echo "<br>";
这里我们用到了preg_replace_callback函数,该函数执行一个正则表达式搜索并且使用一个回调进行替换。换言之,就是第一个参数是正则表达式,第二个参数是一个匹配到结果的回调函数,第三个参数是需要匹配的字符串。注意,回调函数具体什么时候调用,是每次匹配到结果则调用,调用次数不只为一次,匹配不到则不调用。并且该回调函数的参数是匹配的结果,$matches[0]是完整的匹配,$matches[1]是第一个捕获子组的匹配,以此类推。且回调函数需要把更改的结果return出去,不然则忽略捕获的字符串
正则表达式比较简单,这里就不具体分析了。
正则速查表
下面,我们用表格的形式简要汇总下正则表达式的语法。





下面是几篇比较值得学习的正则表达式的文章,本文部分参考也来源于此。
正则表达式30分钟入门教程
https://deerchao.net/tutorials/regex/regex-1.htm
计算机程序的思维逻辑 (88) - 正则表达式 (上)
http://www.cnblogs.com/swiftma/p/6947316.html
php 把驼峰样式的字符串转换成下划线样式的字符串的更多相关文章
- PHP面试题之驼峰字符串转换成下划线样式例子
自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_str ...
- Java将CST的时间字符串转换成需要的日期格式字符串
已知得到的Date类型的变量meettingdate 的值为Sun Dec 16 10:56:34 CST :现在要将它改为yyyy-MM-dd类型或yyyy年MM月dd日: 变为yyyy年MM月dd ...
- JZ-049-把字符串转换成整数
把字符串转换成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 返 ...
- ASP.NET Core 请求/查询/响应参数格式转换(下划线命名)
业务场景: 在 ASP.NET Core 项目中,所有的代码都是骆驼命名,比如userName, UserName,但对于 WebApi 项目来说,因为业务需要,一些请求.查询和响应参数的格式需要转换 ...
- vue中将html字符串转换成html后的一些问题
今天整理之前做vue项目时遇到的一些问题,发现了当时遇到的一个很小但是又会引出很多问题的一个问题(总之就是很有意思,听我慢慢给你到来),这个问题就是当时处理后端数据时,如何将后端返回来的字符串转换成h ...
- Gson将字符串转换成JsonObject和JsonArray
以下均利用Gson来处理: 1.将bean转换成Json字符串: public static String beanToJSONString(Object bean) { return new Gso ...
- JS 实现"可读"字符串转换成"二进制的01"字符串
问题起源 看过一个漫画, 两位程序员在办公司交流, 可是说的语言却是010101类似的字符串.周围人很是惊异.计算机的世界,确实是由01组成的.今天突然想实现这个编码转换. 解决思路 学过C语言的都知 ...
- List转换成json格式字符串,json格式字符串转换成list
一.List转换成json字符串 这个比较简单,导入gson-x.x.jar, List<User> users = new ArrayList<User>(); Gson g ...
- js 字符串转换成数字的三种方法
在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...
随机推荐
- Object.prototype.toString.call()方法浅谈
使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下: Object.prototype.toString.call(value) 1.判断基本类型: Obj ...
- 常用OJ名字+地址(自用)
常用OJ名字+地址 不定期更新,自己用,有补充的也可以给我说说哈. 中文 openjudge 地址:openjudge.cn 说明:北大提供的一个平台,学校可申请小组: 比较好的小组: 计算概论:ic ...
- POJ 3673 Cow Multiplication
Cow Multiplication Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13312 Accepted: 93 ...
- Effective Java 第三版——24. 优先考虑静态成员类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- parse_str() 函数把查询字符串解析到变量中。
注释:如果未设置 array 参数,则由该函数设置的变量将覆盖已存在的同名变量. 注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出.如果已启用,那么在 parse ...
- 高级设置电脑系统windows7防火墙出错代码0×6D9原因与解决技巧
高级设置windows防火墙能够更好的保护电脑系统安全,在电脑系统windows7设置过程中难免会遇到某些问题,有用户在安装MRGT后想要打开SNMP的161端口,但在打开高级安全windows防火墙 ...
- Binlog的三个业务应用场景
1.什么是binlog binlog是mysql的一种二进制日志文件,用来记录数据的变化.mysql使用binlog进行主从复制,如图: 客户端向master的mysql sever写入数据 当数据发 ...
- <c:forEach 的常用整理
<c:forEach items="${images}" var="img" varStatus="status"> <d ...
- -bash: warning: setlocale: LC_CTYPE: cannot change locale (EN_US.UTF-8): No such file or directory
出问题原因: 通过 su - 切换用户时候,LANG设置为en或者设置错误,切换角色会出现这个错误 如何解决? echo $LANG # 查看 LANG 参数 sed 's#LANG=en#LANG= ...
- CSDN博客测试目录
经常写博客,但是一般没怎么注意些目录,最近看别人写的博客都有目录,所以我也想在以后写好目录,这样子也方便阅读. 这里就写一个实验: 这里一级目录 这里是一级目录下的文本.林肯公园 这里是1.1目录 这 ...