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
我的论坛源代码(四)
Oct 09 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
php获取远程文件大小
Oct 20 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
May 12 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 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 file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
vue的基本用法与常见指令
2017/08/15 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Django models filter筛选条件详解
2020/03/16 Python
Python3爬虫mitmproxy的安装步骤
2020/07/29 Python
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
Collection和Collections的区别
2016/05/02 面试题
招聘专员岗位职责
2014/03/07 职场文书
十八大演讲稿
2014/05/22 职场文书
明确岗位职责
2015/02/14 职场文书
会计主管岗位职责
2015/04/02 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
七年级作文之雪景
2019/11/18 职场文书