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 相关文章推荐
我的论坛源代码(六)
Oct 09 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
php结合正则批量抓取网页中邮箱地址
May 19 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
PHP设计模式之观察者模式定义与用法分析
Apr 04 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php array_unique之后json_encode需要注意
2011/01/02 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
2015/08/26 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
python pygame实现2048游戏
2018/11/20 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
医大实习自我鉴定
2013/12/07 职场文书
大一自我鉴定范文
2013/12/27 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python