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 相关文章推荐
PHP默认安装产生系统漏洞
Oct 09 PHP
PHP XML数据解析代码
May 26 PHP
php trim 去除空字符的定义与语法介绍
May 31 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
php根据分类合并数组的方法实例详解
Nov 06 PHP
PHP导入导出Excel代码
Jul 07 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
使用Thinkphp框架开发移动端接口
Aug 05 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
程序员的表白神器“520”大声喊出来
May 20 PHP
PHP函数引用返回的实例详解
Sep 11 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
php email邮箱正则
2008/10/08 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
Vue生命周期示例详解
2017/04/12 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
对python周期性定时器的示例详解
2019/02/19 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
外贸学院会计专业应届生求职信
2013/11/14 职场文书
上课睡觉检讨书
2014/01/28 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
自我检讨书怎么写
2015/05/07 职场文书