Go to comments

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 计算字符串的"字符"个数

二、查找字符串位置

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

三、字符串替换

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);
}

四、截取字符串函数

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

五、分隔,链接,反转函数

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中国美国日本

六、空白处理函数

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代码、数据库安全处理)

$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; // 在页面中,什么也看不到

但是用户确实需要显示大于号,小于号的是要写实体字符,大于号&gt;、小于号&lt;

htmlspecialchars()函数,将字符串中的一些字符串转换为HTML实体

三个单词组成

html

special 特殊的

chars

$str = '<ab>';

echo htmlspecialchars($str); // <ab>

右键查看源码:&lt;ab&gt;

https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp


htmlspecialchars() 特殊符号转成HTML实体

htmlspecialchars_decode() HTML实体转成特殊符号

$str = '&lt;ab&gt;';

echo htmlspecialchars_decode($str);  // 右键源码:<ab>

八、字符串比较函数

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

九、字符大小写转换

$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)



Leave a comment 0 Comments.

Leave a Reply

换一张