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
php smarty的预保留变量总结
Dec 04 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
php读取文件内容到数组的方法
Mar 16 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
Yii rules常用规则示例
Mar 15 PHP
php英文单词统计器
Jun 23 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
Nov 04 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
77A一级收信机修理记
2021/03/02 无线电
PHP生成UTF8文件的方法
2010/05/15 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
2020/12/08 Python
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
J2EE面试题大全
2016/08/06 面试题
学历公证书范本
2014/04/09 职场文书
安全负责人任命书
2014/06/06 职场文书
党性观念心得体会
2014/09/03 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
入党积极分子个人总结
2015/03/02 职场文书
手机销售员岗位职责
2015/04/11 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
阿里云日志过滤器配置日志服务
2022/04/09 Servers