PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例


Posted in PHP onAugust 10, 2017

本文实例讲述了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出去,不然则忽略捕获的字符串

正则表达式比较简单,这里就不具体分析了。

正则速查表 https://3water.com/article/67634.htm

详细的正则表达式语法可参考:

正则表达式30分钟入门教程 https://3water.com/tools/zhengze.html

PHP 相关文章推荐
很实用的一个完整email发送程序
Oct 09 PHP
php 常用字符串函数总结
Mar 15 PHP
php+AJAX传送中文会导致乱码的问题的解决方法
Sep 08 PHP
PHP 事务处理数据实现代码
May 13 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
php自定义函数转换html标签示例
Sep 29 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
Dec 05 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
Jun 10 PHP
利用php获得flv视频长度的实例代码
Oct 26 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 #PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 #PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 #PHP
Laravel实现定时任务的示例代码
Aug 10 #PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 #PHP
PHP实现将标点符号正则替换为空格的方法
Aug 09 #PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 #PHP
You might like
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
php实现读取超大文件的方法
2014/07/28 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
JavaScript异步加载问题总结
2018/02/17 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
浅谈五大Python Web框架
2017/03/20 Python
python数据结构之链表详解
2017/09/12 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
工程总经理工作职责
2013/12/09 职场文书
代理人委托书
2014/08/01 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
社区义诊通知
2015/04/24 职场文书
大学推普周活动总结
2015/05/07 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python