

用 PHP 实现字符串大小写转函数的功能
source link: https://mp.weixin.qq.com/s/hUat_nu3qivO6vNpUboxuQ?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

字符串的大小写转换功能在日常中经常使用。那么如何实现一个简单的大小写转换功能呢?
在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
Recommend
-
109
技术成就梦想51CTO-中国领先的IT技术网站 您浏览的内容找不到或已被删除
-
68
-
13
程序员 - @GDC - 例如,输入 abcXYZhello123 输出 ABCxyzHELLO123 ;就是把字符串中的大写全换成小写、小写全换成大写。除了逐个字符判断+替换,还有什么更快速高效的方法吗?
-
11
什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量。 什么是字符串表达式计算?即,我们需要一段程序来执行动态的表达式,如给定一个含表达式的...
-
6
C语言编程>第十三周 ② 请编写函数fun,该函数的功能是:将放在字符串数组中的M个字符串(每串的长度不超过N),按顺序合并组成一个新的字符串。 ...
-
9
Java将英文字符串转换为驼峰式大小写的方法 | baeldung驼峰式大小写有两种类型:驼峰小写,第一个单词的第一个字符是小写:thisIsLowerCamelCase 驼峰大写,也称为标题大写,其中第一个单词的第一个字符是大写的:ThisIsLowerCamelCase
-
6
GROUP_CONCAT适用于拼接多条数据相同列,需要使用分割符的字符串查询结果.默认使用逗号作为分隔符语法: 必须配合GROUP BY一起使用GROUP_CONCAT(字段)...
-
9
PHP 字符串中直接解析函数的写法PHP 中的字符串理论上是不能够解析函数的,仅能够解析变量。最近发现一种特殊的写法,是可以让字符串直接解析函数的。// 单行 ${!${''} = 代码} // 多行 ${!${''} = 代码 }个人认为这种写法实际...
-
7
本文分享自华为云社区《GaussDB(DWS) 大小写不敏感函数》,作...
-
9
PHP大小写问题整理 PHP对大小写敏感问题的处理比较乱,写代码时可能偶尔出问题,所以这里总结一下。 但我不是鼓励大家去用这些规则。推荐大家始终坚持“大小写敏感”,遵循统一的代码规范。 1、变量名区分大小写 代码如下:
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK