PHP 字符串系统函数
PHP 手册
https://www.php.net/manual/zh/ref.strings.php
https://www.w3school.com.cn/php/php_ref_string.asp
https://www.w3cschool.cn/php/dict
PHP函数非常非常多,下面按照燕十八老师的课程归为9大类,每一类选2、3个
常用字符串函数:
1. 字符串长度
2. 查找字符串位置函数
3. 字符串替换函数
4. 提取字符串函数(双字节)
5. 分隔、链接、反转函数
6. 去除、增加、空格函数
7. HTML代码、数据库安全处理有关函数
8. 比较字符串函数
9. 字符大小写转换函数
函数 | 作用 | 语法 |
---|---|---|
一、字符串长度 | ||
strlen() | 获取字符串长度,长度是按照字节算的 | int strlen(string $string) |
mb_strlen() | 计算字符串的字符个数 | int mb_strlen(string $string [,string $encoding]); |
二、查找字符串位置 | ||
strpos() | 查找字符串中"子字符串"的位置 | strpos( string $haystack, mixed $needle [,int $offset = 0] ) |
substr_count() | int substr_count( string $haystack, string $needle [, int $offset = 0 [, int $length]] ); | |
三、字符串替换 | ||
str_replace() | 替换字符串 | mixed str_replace(mixed $search, mixed $replace, mixed $subject [, int &$count]); |
strtr() | strtr是以单个字符,一对一替换的 | string strtr( string $str, string $from, string $to ); |
str_irreplace() | str_irreplace(search, replace, $str) | |
substr_replace() | substr_replace($str, $rep, $start[, lenght]) | |
四、截取字符串函数 | ||
substr() | string substr(string $string, int $start [,int $length]) | |
strstr() | 查找字符串的首次出现 | string strstr( string $haystack, mixed $needle ) |
strrchr() | 从最后一次搜索到字符串处返回 | |
stristr() | 功能同strstr,只是不区分大小写 | |
五、分隔,链接,反转函数 | ||
str_split() | 将字符串转换为数组,split在英语里分隔的意思 | array str_split(string $string, int $split_length = 1); |
split() | 把$str按search字符进行分隔返回数组 | split(search, $str [,int]) |
explode() | 将数组用特定的分隔符转变为字符串 | array explode(string $separator, string $string, int $limit = PHP_INT_MAX) |
implode() | 将数组用特定的分隔符转变为字符串 | string implode(string $glue, array $pieces) |
六、空白处理函数 | ||
chunk_split() | 将一个字符串分割成小块 | string chunk_split(string $string, int $length = 2, string $separator = "\r\n"); |
str_pad() | 对字符串两侧补空白 | |
trim() | strimg trim(string $str [,string $charlist]) | |
ltrim() | strimg ltrim(string $str [,string $charlist]) | |
rtrim() | strimg rtrim(string $str [,string $charlist]) | |
七、字符串转义函数(HTML代码、数据库安全处理) | ||
addslashes(string $str) | ||
stripslashes(string $str) | ||
htmlspecialchars() | 将字符串中的一些字符串转换为HTML实体 | |
htmlspecialchars_decode() | 将HTML中的实体,转换为字符 | |
get_magic_quotes_gpc() | ||
html_entity_decode() | 将HTML实体转换为字符 | |
htmllentitles() | 将字符串中所有可转换字符,转换为HTML实体 | |
八、字符串比较函数(按二进制ASCII码来比较的) | ||
strcmp() | 字符串比较 | int strcmp(string $str1, string $str2) |
strcasecmp() | 同上,字符串比较,不区分大小写 | |
九、字符大小写转换 | ||
strtolower($str) | 字符串转换为小写 | |
strtoupper($str) | 字符串转换为大写 | |
ucwords($str) | 将每个单词的首字母转换为大写 | |
ucfirst($str) | 将字符串的第一个字符转换为大写 |
一、字符串长度函数
int strlen(string $string);
int代表返回值类型,int是整数类型
string $string,参数是字符串类型
成功,返回字符串的长度,如果字符串为空,则返回0
int mb_strlen(string $string [,string $encoding]);
第二个参数是中括号,说明这个参数是可选的
$encoding参数为字符串编码。如果省略,则使用内部字符编码
1、strlen函数
int strlen( string $string ); 获取字符串长度,长度是按照字节算的
$str = 'hello'; echo strlen($str),'<br/>'; // 5 $str = '中国'; echo strlen($str); // 6 /** * 为什么'中国'是6个字节? * utf8编码规则下,一个中文占3个字节,两个中文占6个字节 * 如果是gbk编码(ANSI编码代表gbk),一个中文有2个字节,两个中文占4个字节 * utf8或gbk编码下,英文字母是ASCII字符,一个字母占一个字节 * */
2、mb_strlen函数
int mb_strlen( string $string [,string $encoding] ); 计算字符串的字符个数
$str = '当年明月'; echo '字节长度:',strlen($str),'<br/>'; // strlen获取字节长度:12 echo '字符长度:',mb_strlen($str),'<br/>'; // 字符长度:4 echo '字符长度:',mb_strlen($str, 'utf-8'),'<br/>'; // 字符长度:4 echo '字符长度:',mb_strlen($str, 'GBK'),'<br/>'; // 字符长度:6
编码是有规律的
strlen 计算字符串的是"字节"长度
mbstrlen 计算字符串的"字符"个数
二、查找字符串位置
int strpos(string $haystack, mixed $needle [,int $offset = 0]);
查找字符串首次出现的位置
mixed 混合类型,可以容纳多种类型的参数。如果不是字符串,那么它将被转为整形,并视为字符的顺序值
int stripos($str, search, [int]);
函数返回字符串在另一个字符串中,第一次出现的位置。该函数对大小写不敏感
int strrpos($str, search, [int]);
查找search在$str中的最后一次出现的位置从int
1、strpos函数
int strpos( string $haystack, mixed $needle [,int $offset = 0] ); 查找字符串中"子字符串"的位置
第一个参数是大字符串,第二个参数要查找字符串'fine'
$str = 'how are you! fine thank you, may be you are right, 256, I dont think so,let me see, I can not fine'; echo strpos($str, 'fine'),'<br/>'; // 13 // 经过了13字节后找到了'fine'
第二个参数$needle是mixed类型(混合类型),这次查找数字类型
$str = 'how are you! fine thank you, may be you are right, 256, I dont think so,let me see, I can not fine'; var_dump(strpos($str, 256)); // bool(false) echo '<br/>'; var_dump(strpos($str, '256')); // int(51),'256'加上单引号,明确是字符串 echo '<br/>'; var_dump(strpos($str, 97)); // int(4) /** * 找数字类型256找不到返回false,查找数字类型97找到了,这是为什么? * 因为在ASCII码中 * 60 到 90,是大写A-Z * 98 到 112,是小写a-z * 当第二个参数为整形的时候,则会理解为ACSII码 * 小写的a对应的ACSII码是97 * */
使用第三个参数offset,继续再字符串中还找这个'fine'。
注意:再计算机里,无论是数组还是字符串都是从0开始读的
$str = 'how are you! fine thank you, may be you are right, 256, I dont think so,let me see, I can not fine'; echo strpos($str, 'fine'),'<br/>'; // 13 /** * 经过了13个字节(后面)之后找到'fine',现在还想找的这个'fine',在找到的第一个'fine'的后面还有没有'fine'了? * 这个时候第3个可选参数,offset的作用就体现出来的 * * offset在英语里的意思是偏移量,意思是把光标偏移一段距离再查找,别从头查找了 * 1. 第一次查找fine位置返回13 * 2. 13 + fine长度是4 = 17 * 3. 从第17个字节后面开始找,也就是从这段'how are you! fine'的后面找 * 4. strlen函数获取字符串长度是98个字符,在字符串94个字符后面,又找到了'fine' * */ echo strlen($str),'<br/>'; // 98, echo strpos($str, 'fine', 17),'<br/>'; // 94
2、综合练习
写一个函数findSub(),判断指定的"父字符串"中,有没有某"子字符串"
/** * findSub($str, $fine)找子字符串函数 * $str string 父字符串 * $find string 要找的子字符串 * */ function findSub($str, $fine){ $results = strpos($str, $fine); if($results){ return $results; }else{ return false; } } $title = 'today is sunny'; $searchStr = 'is'; if(findSub($title, $searchStr)){ echo $searchStr,'子串在第',findSub($title, $searchStr),'字符后面','<br/>'; // is子串在第6字符后面 }else{ echo '没有',$searchStr,'子串'; }
这次找'today'
$title = 'today is sunny'; $search = 'today'; if(findSub($title, $search)){ echo $search,'子串在第',findSub($title, $search),'字符后面','<br/>'; }else{ echo '没有',$search,'子串'; // 没有today子串 } function findSub($str, $fine){ $results = strpos($str, $fine); if($results){ return $results; }else{ return false; } } /** * 明明有'today'子串,怎么判断没有呢? * 1). 因为'today'的位置是0 * 2). 0在if判断的时候当做false * */
看手册,strpos函数
返回值:以整型返回位置信息。如果没有找到needle,strpos()将返回布尔值型FALSE值
没有找到返回的布尔类型的FALSE,要想把0和false取分出来,要用全"等于运算符" ===
function findSub($str, $fine){ $results = strpos($str, $fine); //var_dump($results); if($results === false){ // strpos函数没有找到的返回值是false,所以全等于false来判断 return false; }else{ return $results; } } $title = 'today is sunny'; $search = 'today'; if(findSub($title, $search) || findSub($title, $search) === 0){ echo $search,'子串在第',findSub($title, $search),'字符后面','<br/>'; // today子串在第0字符后面 }else{ echo '没有',$search,'子串'; }
面试的时候经常会问“等于”与“全等”的问题
比如:要求举例,三个全等于是假,两个等于是真的场景
这个场景在strpos函数,再典型不过了
$str = 'abcdef'; echo strpos($str, 'z') === false ? '没有' : '有'; // 没有 echo '<br/>'; echo strpos($str, 'e') === false ? '没有' : '有'; // 有 echo '<br/>'; echo strpos($str, 'a') === false ? '没有' : '有'; // 有
再看一题
用for循环或while循环,配合strpos函数
计算某父字符串中,子串出现的次数
我自己先尝试实现
第一步,循环和循环停止的逻辑
$str = 'adgsadwesadfaaxacavgay'; $whileNum = 1; // 记录while循环的次数 while($whileNum){ echo $whileNum ,'-',strlen($str),'<br/>'; if(strlen($str) == $whileNum){ $whileNum = 0; }else{ $whileNum ++; } }
第二步,在循环中计算,字符串出现的此时
$str = 'adgsadwesadfaaxacavgay'; $whileNum = 1; // 记录while循环的次数 $Position = 0; // 第一次查找的位置 $strNum = 0; // 记录子字符串出现的次数 while($whileNum){ if(strpos($str, 'a', $Position)){ $Position = strpos($str, 'a', $Position); $Position++; $strNum ++; //echo $Position,'Position<br/>'; } if(strpos($str, 'a', $Position) === 0){ $Position = strpos($str, 'a', $Position); $Position++; $strNum ++; } if(strlen($str) == $whileNum){ $whileNum = 0; }else{ $whileNum ++; } } echo '字符串a出现:',$strNum,'次';
实现了功能自己也真写晕了,看燕十八老师教程里的代码
/** * 函数 subnum($str, $sub) * $str string 父字符串 * $sub string 待查子字符串 * return int 返回子串个数 * * 思路: * 先从头查找子串,找到后,偏移过找到的子串,再继续查找,直到查不到 * */ function subnum($str, $sub){ $sublen = strlen($sub); // 获取子字符串的长度 $strlen = strlen($str); // 获取字符串的长度 // 如果子字符串长度,大于父字符串,就没有必要找了 if($sublen > $strlen){ return 0; } // 开始计算子字符串的长度 for($offset = 0,$num = 0; ($offset = strpos($str, $sub, $offset))!==false; ){ $num++; $offset += $sublen; } return $num; } $str = 'how are you! fine thank you, fine, may be you are right, 256, I dont think so,let me see, I can not fine'; echo subnum($str, 'fine'); // 3
3、substr_count()函数
开发中不用我们自己写函数,PHP中有这样的查找函数substr_count()
int substr_count( string $haystack, string $needle [, int $offset = 0 [, int $length]] );
$str = 'how are you! fine thank you, fine, may be you are right, 256, I dont think so,let me see, I can not fine'; echo substr_count($str, 'fine'); // 3
三、字符串替换
mixed str_replace(mixed $search, mixed $replace, mixed $subject [, int &$count]);
返回值是mixed类型
该函数返回一个字符串或者数组,所以返回值是mixed类型
将在$subject中查找$search,并用$replace替换
$count可选参数,如果指定值,它的值将被替换发生的次数
strtr($str, search, replace);
函数的replace不能为""
str_irreplace(search, replace, $str)
substr_replace($str, $rep, $start[, lenght])
$str原始字符串
$rep替换后的新字符串
$start起始位置
lenght替换的长度,该项可选
1、str_replace()函数
mixed str_replace( mixed $search, mixed $replace, mixed $subject [, int &$count] );
str指字符串,replace在英语里有替换的意思,str_replace合起来就是替换字符串的意思
下面把字符串中的'hi',换成'hello'
/** * str_replace('hi', 'hello', $str); * 1. 第一个参数是要寻找谁,要寻找'hi' * 2. 要替换成什么?要替换成'hello' * 3. 要操作哪一个字符串?要操作字符串$str * 4. 返回值:操作的是一个字符串,返回的还是一个字符串 * */ $str = 'hi, this is lily, history'; $newStr = str_replace('hi', 'hello', $str); echo $newStr; // hello, thellos is lily, hellostory
字符串中所有'hi'的,都被替换了
能否统计一下替换了几次呢?
这次用到了第4个参数count,int类型,而且是"引用赋值",传的是参数的地址,这意味着操作的是一个全局变量
$str = 'hi, this is lily, history'; $newStr = str_replace('hi', 'hello', $str, $num); // 多传一个 $num 参数(第四个参数) echo $newStr,'<br/>'; // hello, thellos is lily, hellostory echo $num; // 3
继续研究$search参数,还有可能是mixed混合类型的,怎么来理解混合呢?
下面把'hi'替换成'hello'的同时,再把'li'换成'ul'
就以目前的知识,可以用str_replace方法替换两次
$str = 'hi, this is lily, history'; $newStr1 = str_replace('hi', 'hello', $str); $newStr2 = str_replace('li', 'ul', $newStr1); echo $newStr1,'<br/>'; // hello, thellos is lily, hellostory echo $newStr2,'<br/>'; // hello, thellos is ully, hellostory
替换两次比较麻烦,能不能一次替换完成呢?
能,用数组
1). 要找到hi,还有li $search = array('hi', 'li');
2). 要对应替换的hello 和 ul $replace = array('hello', 'ul');
我们可以用数组,一次性的替换多个
$str = 'hi, this is lily, history'; $search = array('hi', 'li'); // 要找到hi,还有li $replace = array('hello', 'ul'); // 要对应替换的hello 和 ul $newStr = str_replace($search, $replace, $str); echo $newStr,'<br/>'; // hello, thellos is ully, hellostory
但是在替换时候出现了一个问题
hi 替换--> hello
this 替换--> thellos
单词this中间的一部分(hi)也被替换了,导致this单词错误
能不能专门替换单词'hi',如果'hi'是其它单词的一部分就不替换?
用正则表达式(本节课不讲正则部分了)
燕十八老师突发奇想
hi 替换成-> hello
hello 替换成 -> hi
$str = 'hi lily, hello jim'; $newstr = str_replace(array('hi', 'hello'), array('hello', 'hi'), $str); echo $newstr; // hi lily, hi jim /* * 结果跟燕十八老师预想的不一样 * * 因为原理是分两次替换 * 第一次替换 hi -> hello * 字符串变成了 'hello lily, hello jim' * * 然后第二次,hello -> hi * 于是变成了 'hi lily, hi jim' * */
碰到上面这种情况,可以用strtr函数
2、strtr()函数
第一种用法
string strtr( string $str, string $from, string $to );
这个函数的replace不能为""
$str 第一个参数,被操作的字符串
$from 第二个参数,原始字符串
$to 第三个参数,是替换后的
strtr的要求和str_replace不一样
$str = 'hi lily, hello jim'; $newstr = strtr($str, 'hi', 'hello'); // 把'hi'替换成'hello' echo $newstr; // he lely, hello jem
为什么不是'hello lily, hello jim'
仔细读一读手册:如果from与to长度不相等,那么多余的字符部分将被忽略。
strtr是以单个字符,一对一替换的
hi --> he
liely --> lely
jim --> jem
strtr是以单个字符对应来替换的
比如:strtr($str, 'hi', 'ab'),则执行两次
如果感觉这种strtr替换很别扭,看着不舒服,可以换一个写法
第二种用法
string strtr( string $str, array $replace_pairs );
pairs有'成对'的意思
$replace_pairs 第二个参数是一个数组
全角字符转半角
/** * 用户在网站上,输入的全角字符,由我们的程序统一把全角转半角 * 开发中,全角转半角,这个功能常见 * 比如ecshop里面就有 * */ $str = '你好12334'; $newstr = strtr($str, array('1' => '1', '2' => '2', '3' => '3', '4' => '4')); echo $newstr; // 你好12334
ecshop里面的半角转全角的函数
位置:ecshop -> includes -> lib_base.php -> make_semiangle
/** * 将一个字串中含有全角的数字字符、字母、空格或'%+-()'字符转换为相应半角字符 * * @access public * @param string $str 待转换字串 * * @return string $str 处理后字串 */ function make_semiangle($str) { $arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y', 'z' => 'z', '(' => '(', ')' => ')', '〔' => '[', '〕' => ']', '【' => '[', '】' => ']', '〖' => '[', '〗' => ']', '“' => '[', '”' => ']', '‘' => '[', '’' => ']', '{' => '{', '}' => '}', '《' => '<', '》' => '>', '%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-', ':' => ':', '。' => '.', '、' => ',', ',' => '.', '、' => '.', ';' => ',', '?' => '?', '!' => '!', '…' => '-', '‖' => '|', '”' => '"', '’' => '`', '‘' => '`', '|' => '|', '〃' => '"', ' ' => ' '); return strtr($str, $arr); }
四、截取字符串函数
string substr(string $string, int $start [,int $length]); 截取字符串
$string 待截取的字符串
$star int类型,截取开始的位置
$length 截取字符串的长度,正数时候代表截取的长度,负数时代表截取结束的位置
string strstr(string $haystack, mixed $needle, bool $before_needle = false); 查找字符串的首次出现
从$haystack(第一个位置)搜索$needle,并从它开始截取到结束字符串,若没有则返回FALSE
strrchr() 从最后一次搜索到字符串处返回
stristr() 功能同strstr,只是不区分大小写
1、substr函数
string substr( string $string, int $start [,int $length] ); 截取字符串
把字符串前面3字符个去掉,就留下后面部分
/** * $str = 'abcdef' * 从第3个字符d开始截取 * 当第三个参数不指定时候,截取到字符串的结尾 * */ $str ='abcdef'; echo substr($str, 3),'<br/>'; // def
但是经理要求,把字符串后3个字符字符截取出来,怎么做呢?
方法1
1). 先算出字符串长度length
2). 再length-3
// 字符串任意长度,都截取后3个字符 $str ='abcdefg'; // $str = 'abc'; // $str ='abcdefg\'safesad'; $start = strlen($str) - 3; echo $start,'<br/>'; // 4 / 0 / 12 echo substr($str, $start); // efg / abc / sad
方法2:
起始位置不从左边数,而是用负数(-$start),从右边往左数
$str ='abcdefgsafesad'; echo substr($str, -3); // sad
经理又要求,专门截取字符串开头的3个字符
$start 第二个参数填0,从头开始截取
$length 第三个但是填3,截取3个长度
第三个参数length为正数的时候,代表要截取的长度
$str ='abcdefghijk'; echo substr($str, 0, 3); // abc
经理又有要求了,截取除了开头3位,和尾3三位,既,要中间的那段字符串
分析:
$start 第二个参数,应该是3
$length 第三个参数代表截取的长度,但是字符串长度不一定。
这时候,可以把length写成负数。当length是负数,它不代表长度,代表截取结束的位置
$str ='123456789'; echo substr($str, 3, -3); // 456
截取中文字符
substr方法是按照字节来操作的,不考虑编码
utf-8编码三个字节一个中文字符
$str = '壹贰叁肆伍陆柒捌玖'; echo substr($str, 0, 9),'<br/>'; // 从0开始截取3个中文字符:壹贰叁 echo substr($str, 9, 9),'<br/>'; // 从第3个字符开始截,截取3个中文字符:叁肆伍 echo substr($str, -9),'<br/>'; // 从后面截取3个中文字符:柒捌玖 echo substr($str, 9),'<br/>'; // 去掉前3个字符:肆伍陆柒捌玖 echo substr($str, 9 ,-9),'<br/>'; // 去掉前后3个中文字符:肆伍陆 echo substr($str, 4, 6); // 乱码
有这样的面试题
问,如果截取无乱码的中文(UTF-8编码)
2、strstr()函数
string strstr( string $haystack, mixed $needle ) 查找字符串的首次出现
找字符串中的点".",返回一个截取后的字符串
/** * strstr()函数作用是: * 1. 找到指定的$needle,而且是第一次出现的位置 * 2. 返回该位置,至截取到字符串结尾的这一部分 * */ $str = 'abc.def.jpg.exe'; echo strstr($str, '.'); // .def.jpg.exe
经理说能否把第一次找到的$needle前面的返回,也就是说点'.'前面的'abc'部分截取出来
从PHP5.3开始,strstr函数多了第三个可选参数$before_needle
1). string strstr( string $haystack, mixed $needle, bool $before_needle = false )
2). $before_needle如果为true返回$needle之前的部分
$str = 'abc.def.jpg.exe'; echo strstr($str, '.', true); // abc
用substr函数实现需求
$str = 'abc.def.jpg.exe'; echo substr($str, 0, -strlen(strstr($str, '.'))),'<br/>'; // abc echo substr($str, 0, strlen(strstr($str, '.'))-1); // abcabc.def.jpg
3、strrchr()函数
strstr === strchr
strrchr(string, char)
string 必需。规定要搜索的字符串
char 必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符。
返回从某个字符串在另一个字符串中最后一次出现的位置到主字符串结尾的所有字符。 如果未找到此字符,则返回 FALSE。
r有rigth右边的意思
strchr()函数返回以$needle(char)的最后出现的位置开始,直到字符串结尾
这时候经理又说,能否把字符串$needle,最后一次出现的位置找出来,然后从该位置一直截到结尾
$str = 'abc.def.jpg.exe'; // 也就是说截取最后的'exe' echo strrchr($str, '.'); // .exe
面试时候,让计算一个文件的后缀用strrchr函数
$file = 'new.txt'; echo strrchr($file, '.'); // .txt
五、分隔,链接,反转函数
array str_split(string $string, int $split_length = 1); 将字符串转换为数组
$string 字符串
$string_length 每一段的长度
把$string按$split_length的长度进行分隔,返回数组
split(search, $str [,int]);
把$str按search字符进行分隔返回数组,int是分隔几次,后面的将不在分隔
array explode(string $separator, string $string, int $limit = PHP_INT_MAX);
此函数返回由字符串组成的数组,每个元素都是string的一个子串,它们被字符串separator作为边界点分割出来。
$separator 边界上的分隔字符。
$string 输入的字符串
string implode(string $glue, array $pieces);将数组用特定的分隔符转变为字符串
$glue 默认为空的字符串。
$pieces 想要转换的数组。
返回一个字符串,其内容为由glue分割开的数组的值。
1、str_split() 字符串分隔函数
array str_split( string $string, int $split_length = 1 ); 将字符串转换为数组,split在英语里分隔的意思
$str = 'abcdef'; $arr = str_split($str); print_r($arr); // Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f ) /* * 'abcdef'字符串的字符,一个一个拆成数组了,每个单元一个字符 * Array * ( * [0] => a * [1] => b * [2] => c * [3] => d * [4] => e * [5] => f * ) * */
经理问:能不能,2个字符一个单元,ab一个单元、cd一个单元、ef一个单元
$str = 'abcdef'; $arr = str_split($str, 2); print_r($arr); // Array ( [0] => ab [1] => cd [2] => ef ) /** * Array * ( * [0] => ab * [1] => cd * [2] => ef * ) * */
4个字符一个单元,前面abcd一个单元,后面ef不够4个了,会怎么样?
$str = 'abcdef'; $arr = str_split($str, 4); var_dump($arr); // array(2) { [0]=> string(4) "abcd" [1]=> string(2) "ef" } /** * 截取到最后,剩下的字符串,不够指定的长度,剩下的当做一组 * * array(2) { * [0]=> * string(4) "abcd" * [1]=> * string(2) "ef" * } * */
2、explode(search, $str[,int])函数
array explode( string $separator, string $string, int $limit = PHP_INT_MAX );
implode()方法,将数组用特定的分隔符转变为字符串
PHP中字符串和数组函数是最多的,字符串和数组有explode()和implode()两个函数,可以说是字符串和数组的的桥梁,使用的非常频繁。
有的网站让我们填写标签,要求多个便签用逗号隔开
explode()函数根据指定的分隔符,把字符串拆成数组
$str = 'abc,中国,美国,日本'; $arr = explode(',', $str); print_r($arr); // Array ( [0] => abc [1] => 中国 [2] => 美国 [3] => 日本 )
implode()函数正相反,是根据指定的链接符,把数组在拼接成字符串
手册:join array elements with a string(join英文里有链接的意思),链接一个数组元素,通过一个字符串链接起来。
下面用 ~符号链接
$arr = array('abc', '中国', '美国', '日本'); $str = implode('~', $arr); echo $str; // abc~中国~美国~日本
可以只传一个数组参数,不指定链接符数组做
$arr = array('abc', '中国', '美国', '日本'); $str = implode($arr); echo $str; // abc中国美国日本
六、空白处理函数
string chunk_split(string $string, int $length = 2, string $separator = "\r\n"); 将一个字符串分割成小块
字符串里面按照$length的值的数,分隔字符串,默认用空格分隔
$string 要分割的字符
$length 分割的尺寸
$separator 行尾序列符号
str_pad(); 对字符串两侧补空白
strimg trim(string $str [,string $charlist]);
strimg ltrim(string $str [,string $charlist]);
strimg rtrim(string $str [,string $charlist]);
1、chunk_split()
string chunk_split( string $string, int $length = 2, string $separator = "\r\n" ); 将一个字符串分割成小块
/** * 分隔成3段 * 每段用','号隔开 * */ $str = '12345678'; echo chunk_split($str, 3, ','); // 123,456,78,
不填第三个参数,则默认的是换行符 \r\n
$str = '12345678'; echo chunk_split($str, 3); // 123 456 78 /** * 右键查看源代码 * 123 * 456 * 78 * */
把字符串'12345678',转换成'12,345,678'
下面我的思路,不是很好,还没有实现需求,暂时记录
$str = '12345678'; $num = 0; do{ if($num){ $len = strlen($str); // 7 $num +=$len; // 第二次分隔 $str = chunk_split($str, $num, ','); }else{ // 第一次$num = 2,分隔开始两个字符12,3456789 $num +=2; $str = chunk_split($str, $num, ','); } //echo $num,'<br/>'; if($num >= $len){ $num = 0; } }while($num); echo $str;
七、字符串转义函数(HTML代码、数据库安全处理)
addslashes(string $str);
stripslashes(string $str);
htmlspecialchars(); 将字符串中的一些字符串转换为HTML实体
htmlspecialchars_decode() 将HTML中的实体,转换为字符
get_magic_quotes_gpc();
html_entity_decode() 将THML实体转换为字符
htmllentitles() 将字符串中所有可转换字符,转换为HTML实体
$str = "abc ', hello"; echo $str; // abc ', hello
打印输出'abc ', hello'
现在还没有学mysql,还意识不到一个单引号的破坏作用
但要知道,单引号,双引号如果不小心,数据库是要被注入的
如果确实需要一个单/双引号,怎么办呢?
应该把客户提交的数据,进行转义,以防止单/双引号带来的破坏,主要是对sql语句的破坏
用addslashes()函数输出,把单引号给转义了
$str = "abc ', hello"; echo addslashes($str); // abc \', hello
能不能把'abc \', hello'再转义回'abc ', hello'呢?
$str = 'abc \', hello'; echo stripslashes($str); // abc ', hello
代码中 <ab> 不会在页面上显示
$str = '<ab>'; echo $str; // 在页面中,什么也看不到
但是用户确实需要显示大于号,小于号的是要写实体字符,大于号>、小于号<
htmlspecialchars()函数,将字符串中的一些字符串转换为HTML实体
三个单词组成
html
special 特殊的
chars
$str = '<ab>'; echo htmlspecialchars($str); // <ab>
右键查看源码:<ab>
https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp
htmlspecialchars() 特殊符号转成HTML实体
htmlspecialchars_decode() HTML实体转成特殊符号
$str = '<ab>'; echo htmlspecialchars_decode($str); // 右键源码:<ab>
八、字符串比较函数
按二进制ASCII码来比较的
int strcmp(string $str1, string $str2) 字符串比较
strcasecmp() 同上,字符串比较,不区分大小写
int strcmp( string $str1, string $str2 )
如果str1小于str2,返回负数
如果str1打印str2,返回正数
两个字符串相等,则返回0
/** * ASCII编码中 * D = 68 * a = 97 * */ echo strcmp('D', 'a'),'<br/>'; // -1 echo strcmp('a', 'D'),'<br/>'; // 1 echo strcmp('a', 'a'),'<br/>'; // 0
九、字符大小写转换
strtolower($str) 字符串转换为小写
strtoupper($str) 字符串转换为大写
ucwords($str) 将每个单词的首字母转换为大写
ucfirst($str) 将字符串的第一个字符转换为大写
$str = 'HeLLo, ThiS LilY, BUT, I loVE HanMEImei'; echo strtolower($str),'<br/>'; // 全部转成小写:hello, this lily, but, i love hanmeimei echo strtoupper($str),'<br/>'; // 全部转成大写:HELLO, THIS LILY, BUT, I LOVE HANMEIMEI echo ucwords(strtolower($str)),'<br/>'; // 每个单词的首字母大写:Hello, This Lily, But, I Love Hanmeimei echo ucfirst(strtolower($str)); // Hello, this lily, but, i love hanmeimei
字符串面试题
字符串面试题
1. strlen与mb_strlen的区别是什么?
strlen计算的是字节
mb_strleb计算的是字符
2. 防止sql注入的时候,会把单引号、双引号转义,需要用到那个函数
addslashes()函数
mysql_escape_string 这个函数不怎么用
3. 打印字符串的第一个字母
$str = 'abcdef'; echo substr($str,0,1);
字符串还有一个类数组的特性,可以用索引(下标)把指定的字符取出来
$str = 'abcdef'; echo $str[0];
4. 如何实现字符串反转
'abc' 转成 'cba'
方法1
从尾巴处往前取,先取c拼到一个字符串,再取出b拼到一起……
我自己写的
function sev($str){ $len = strlen($str); $tem = ''; for($i = 1; $len >= $i; $i++){ $tem .= substr($str, $len-$i, 1); //echo $len-$i.'<br/>'; } return $tem; }
燕十八老师写的
function sev($str){ $len = -strlen($str); for($new = '',$start=-1; $start >= $len; $start--){ $new .= substr($str, $start, 1); } return $new; } $str1 = '123456'; $str2 = 'abc'; echo sev($str1),'<br/>'; // 654321 echo sev($str2); // cba
方法2
PHP系统自带的字符串反转函数 strrev()
$str1 = '123456'; $str2 = 'abc'; echo strrev($str1),'<br/>'; // 654321 echo strrev($str2); // cba
5. 使用五种以上的方式,获取一个文件的后缀名
用目前字符串的方法获取
01/
$file = 'a.jpeg.exe'; function getext($str){ return strrchr($str, '.'); // strrchr()函数找最后一个点,及点后面的部分 } echo getext($file); // .exe
02/
找到最后一个"点"出现的位置,再用substr()截取
strpos函数,找"子字符"第一次出现的位置
strrpos函数,找"子字符"最后一次出现的位置
这里用strrpos函数,因为找的是最后一个点出现的位置(预防万一有两个点)
$file = 'a.jpeg.exe'; $need = strrpos($file, '.'); // 6 echo substr($file, $need); // .exe
写成一个函数,strrpos函数和substr函数,嵌套着成一行
function getext($str){ return substr($str, strrpos($str, '.')); } $file = 'a.jpeg.exe'; echo getext($file); // .exe
如果偏用strpos函数,找子字符第一次出现的位置,
方法是:
1). 用strrev函数先把字符串反过来
2). strpos找点的位置,substr根据位置函数截取
3). 再用strrev函数,把字符串反转回去
function getext($str){ // echo strrev($str); // echo strpos(strrev($str), '.'); $str = strrev($str); $str = substr($str, 0, strpos($str, '.')); return strrev($str); } $file = 'a.jpeg.exe.psd'; echo getext($file); // psd
03/
用系统自带的pathinfo()函数
mixed pathinfo( string $path [,int $options] );
返回一个管理数组,含有path信息。包括以下数组单元:dirname,basename和extension
$file = 'http://ruyic.com/blog/uploads/image/202105/pic1622390985110860.png'; $arr = pathinfo($file); print_r($arr); /*** Array ( [dirname] => http://ruyic.com/blog/uploads/image/202105 [basename] => pic1622390985110860.png [extension] => png [filename] => pic1622390985110860 ) ***/ echo $arr['extension']; // png
写成一个函数
$file = 'http://ruyic.com/blog/uploads/image/202105/pic1622390985110860.png'; function getext($str){ $arr = pathinfo($str); return $arr['extension']; } echo getext($file); // png
pathinfo()函数第二个参数options,指定要返回那个单元
options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME
$file = 'http://ruyic.com/blog/uploads/image/202105/pic1622390985110860.png'; echo pathinfo($file, PATHINFO_DIRNAME).'<br/>'; // http://ruyic.com/blog/uploads/image/202105 echo pathinfo($file, PATHINFO_BASENAME).'<br/>'; // pic1622390985110860.png echo pathinfo($file, PATHINFO_EXTENSION).'<br/>';// png echo pathinfo($file, PATHINFO_FILENAME).'<br/>'; // pic1622390985110860
6. 将'1234567890'转成'1,234,567,890'的形式
下面有三种方法
方法1:
01. 回忆一下字符串str_split()分隔函数
$num = 1234567890; function fun($str){ return str_split($str, 3); } print_r(fun($num)); // Array ( [0] => 123 [1] => 456 [2] => 789 [3] => 0 )
02. 字符串,先反转一下strrev(),然后分隔strplit()
$num = 1234567890; function fun($str){ return str_split(strrev($str), 3); } print_r(fun($num)); // Array ( [0] => 098 [1] => 765 [2] => 432 [3] => 1 )
03. 用'点'把数组拼起来 implode()
$num = 1234567890; function fun($str){ $arr = str_split(strrev($str), 3); return implode('.', $arr); } echo fun($num); // 098.765.432.1
04. 再反转一下
function fun($str){ $arr = str_split(strrev($str), 3); return strrev(implode('.', $arr)); } $num = 1234567890; echo fun($num); // 1.234.567.890
方法2:
01.先反转一下字符串
function fun($str){ $num = strrev($str); return $num; } $num = 1234567890; echo fun($num); // 0987654321
02. 用chunk_split函数,3个数个数的拆分,再拆分的地方加入'点'
03. 然后再反转一下
function fun($str){ $str = strrev($str); $str = chunk_split($str, 3, '.'); return strrev($str); } $num = 1234567890; echo fun($num); // .1.234.567.890
04. 最后,去除多余的一个点
function fun($str){ $str = strrev($str); $str = chunk_split($str, 3, '.'); // return substr(strrev($str), 1); return ltrim(strrev($str), '.'); // 指定去除左边的点 } $num = 1234567890; echo fun($num); // 1.234.567.890
方法3:
系统自带的函数number_format(),format格式化的意思
string number_format( float $number [,int $decimals = 0] );
Format a number with grouped thousands
thousands千的意思,就是以千为单位。分隔字符串
系统函数一行语句搞定
$num = 1234567890; echo number_format($num); // 1,234,567,890
(1626308115852)