PHP实现字符串大小写转函数的功能实例


Posted in PHP onFebruary 06, 2019

字符串的大小写转换功能在日常中经常使用。那么如何实现一个简单的大小写转换功能呢?

在php中,最终使用的是c语言的toupper,tolower函数将字符进行大小写转换。因此需要定义一个字符大小写转换的函数。

//字符转大写protected function toupper($c){
$ord = ord($c);
return $ord>=97 && $ord<=122 ?chr($ord-32):$c;}//字符转小写protected function tolower($c){
$ord = ord($c);
return $ord>=65 && $ord<=90 ?chr($ord+32):$c;}

字符的大小写转换就是进行ascii码的转换。A-Z的ASCII码在65-90之间。a-z的ASCII码在97-122之间。对于不在转换区间的字符,应该原样返回

php中字符串大小写转换有下面几个函数 strtolower , strtoupper , lcfirst , ucfirst , ucwords , lcfirst , 这几个函数都是成对的,因此仅以大写转小写为例说明如何实现这几个函数

strtoupper 实现字符串从大写转小写。无非是遍历字符串的每个字符,将大写字符转换成小写。

public function strtolower($str){
 if($this->checkempty($str))
 {
 return "";
 }
 $len = strlen($str);
 for($i=0;$i<$len;$i++){
 $str[$i] = $this->tolower($str[$i]);
 }
 return $str;}

php字符串可以像数组一样用下标获取每个字符。因此对字符串每个字符遍历,转换成小写字符即可

lcfirst 实现首字母大写的功能,因此比strtolower还要简单

public function ucfirst($str){
 if($this->checkempty($str))
 {
 return "";
 }
 $str[0] = $this->toupper($str[0]);
 return $str;}

lcwords 实现单词首字母转小写。说单词,其实是空格后面第一个字符。因此只需要在遍历到空格字符后面第一个非空字符串转换成小写即可。

public function lcwords($str){
 if($this->checkempty($str))
 {
 return "";
 }
 $splitchar = [' ',"\n","\r","\f","\v"];
 $len = strlen($str);
 for($i=0;$i<$len;$i++){
 if(in_array($str[$i], $splitchar))
 {
 $i++;
 if($i>=$len)
 {
 break;
 }
 $str[$i] = $this->tolower($str[$i]);
 }
 }
 return $str;}

主要要小心越界的问题。如果最后一个字符串是空字符。

至于为什么单词分割字符是代码中的那几项,主要是php源码就是根据那几项实现的。php源码中ucwords实现方式如下:

PHP_FUNCTION(ucwords){
 zend_string *str;
 char *delims = " \t\r\n\f\v";
 register char *r, *r_end;
 size_t delims_len = 6;
 char mask[256];

 ZEND_PARSE_PARAMETERS_START(1, 2)
 Z_PARAM_STR(str)
 Z_PARAM_OPTIONAL Z_PARAM_STRING(delims, delims_len)
 ZEND_PARSE_PARAMETERS_END();

 if (!ZSTR_LEN(str)) {
 RETURN_EMPTY_STRING();
 }
 php_charmask((unsigned char *)delims, delims_len, mask);

 ZVAL_STRINGL(return_value, ZSTR_VAL(str), ZSTR_LEN(str));
 r = Z_STRVAL_P(return_value);

 *r = toupper((unsigned char) *r);
 for (r_end = r + Z_STRLEN_P(return_value) - 1; r < r_end; ) {
 if (mask[(unsigned char)*r++]) {
 *r = toupper((unsigned char) *r);
 }
 }}

将分割的字符串放入一个mask中,在遍历字符串的过程中判断是否是mask的字符。如果是则对后面一位字符进行大写转换操作。

最终代码地址https://github.com/froyot/froyot.github.io/tree/master/code

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
PHP Google的translate API代码
Dec 10 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
php生成RSS订阅的方法
Feb 13 PHP
php实现zip文件解压操作
Nov 03 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
PHP内存溢出优化代码详解
Feb 26 PHP
PHP addcslashes()函数讲解
Feb 03 #PHP
PHP addslashes()函数讲解
Feb 03 #PHP
PHP simplexml_load_string()函数实例讲解
Feb 03 #PHP
PHP simplexml_load_file()函数讲解
Feb 03 #PHP
PHP simplexml_import_dom()函数讲解
Feb 03 #PHP
PHP count()函数讲解
Feb 03 #PHP
PHP getDocNamespaces()函数讲解
Feb 03 #PHP
You might like
laravel入门知识点整理
2020/09/15 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
windows系统下Python环境搭建教程
2017/03/28 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
使用python绘制二维图形示例
2019/11/22 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
工作失职检讨书范文
2014/01/16 职场文书
运动会广播稿500字
2014/01/28 职场文书
党校培训自我鉴定
2014/02/01 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
医院党建工作总结2015
2015/05/26 职场文书
校园广播站开场白
2015/06/01 职场文书
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python