字符串简介
- 字符串是PHP中重要的数据类型之一,属于标量类型
- 一个字符串就是由一些列的字符组成,每个字符等同于一个字节
- 字符串需要书写到定界符中
定界符
单引号
双引号
heredoc语法结构
nowdoc语法结构
转义字符
$username = 'king';
echo $username; // king
echo "$username"; // king
echo '$username'; // $username
/**
* 双引号和单引号的区别
* 双引号解析变量,单引号不解析变量,单引号的执行效率更高
* 双引号解析所有的转义符,单引号直解析\\和\'这两种转义符
*/
// 当内容和定界符冲突的时候需要使用转义符
$str = 'this is king\'s PHP,He said "I\'m fine"'; // this is king's PHP,He said "I'm fine"
echo $str;
$str = "He said \"I'm fine\""; // He said "I'm fine"
echo $str;
echo PHP_EOL;
$str="1\n2\r3\t4\\5\$6\"78";
echo $str;
echo PHP_EOL;
$str='1\n2\r3\t4\\5\$6\'78';
echo $str; // 1\n2\r3\t4\5\$6'78
花括号{}作用
- 将变量扩展成整体
当php解析器遇到一个美元符号($)时,它会和其他很多解析器一样,去组合尽量多的标识形成一个合法的变量名。可以用花括号来明确变量名的界线,将变量扩展成一个整体来解析。
$username = 'king';
echo "$username"; // king
echo PHP_EOL;
echo "我的名字是$usernames"; // Notice: Undefined variable: usernames in D:\learning\index.php on line 5
echo PHP_EOL;
echo "我的名字是$username s";// king s
echo PHP_EOL;
echo "我的名字是{$username}s";//kings
echo PHP_EOL;
echo "我的名字是${username}s";//kings
echo PHP_EOL;
echo "我的名字是{ $username }s";//{ king }s
echo PHP_EOL;
echo "我的名字是{ $username}s";//{ king}s
echo PHP_EOL;
echo "我的名字是{$username }s";//kings
- 对字符串中的指定字符做增删改查
字符串下标从0开始
可以使用[]实现相同的操作
$str = "abcdef";
echo strlen($str); // 6
echo PHP_EOL;
// 字符串下标从0开始,查询
echo $str{0}; // a
echo $str[0]; // a
echo $str{2}; // c
// 只能用一个字符修改一个字符
$str{2}="opp";
echo $str;//abodef
// utf8中一个中文字符
$s = '你好';
echo $s{0};
echo $s{1};
echo $s{2};//你
// 删除
//$str{1} = ""; // Warning: Cannot assign an empty string to a string offset
echo $str;//abodef
echo strlen($str);//6
//$str{1} = null; // PHP Warning: Cannot assign an empty string to a string offset
echo $str;//abodef
echo strlen($str);//6
$str{30} = 'g';
echo $str;//abodef g
echo strlen($str); // 31
echo PHP_EOL;
$str="3456";
echo $str{mt_rand(0,strlen($str)-1)}; // 随机取一个
heredoc和nowdoc语法结构
- 标识名称只能包含字母、数字、下划线,并且必须以字母和下划线开始
-
结束符前不能有任何内容,像制表符和空格都不可以
I l\no\tv\re y\\ou {$username}
EOF;
echo <<<"EOF"
I l\no\tv\re y\\ou {$username}
EOF;
// 相当于单引号
echo <<<'EOF'
I l\no\tv\re y\\ou {$username}
EOF;
其他类型转换成字符串型
- 数值型转换成字符串型
- 布尔型转换成字符串型
- NULL转换成字符串型
- 数组转换成字符串
- 对象转换成字符串
- 资源转换成字符串
(1)自动类型转换
/**
* 自动类型转换
* 数值型->数值本身
* true->1
* false->空字符串
* null->空字符串
*/
echo 123;//123
echo 1.2;//1.2
echo true;//1
echo false;//空字符串
echo null; //空字符串
/**
* 数组->Array
* 资源->Resource id #数字
* 对象不能直接转换成字符串
*/
echo [1,2,3];// Array PHP Notice: Array to string conversion
echo fopen('test.php','r'); // Resource id #5
$obj = new stdClass();
var_dump($obj);
/**
* class stdClass#1 (0) {
}
*/
//echo $obj; // PHP Catchable fatal error: Object of class stdClass could not be converted to string
(2)强制类型转换
- 临时转换
/**
* 强制类型转换
* 临时转换(string) strval()两种形式
* 永久转换
*/
$var = 123;//123
$var = 1.2;//1.2
$var = true;//1
$var = false;//空字符串
$var = null; //空字符串
$var = [1,2,3];// Array PHP Notice: Array to string conversion string(5) "Array" 具体数组的值
//$var = fopen('test.php','r'); // string(14) "Resource id #5" resource(5) of type (stream)
//$var = new stdClass(); // //PHP Catchable fatal error: Object of class stdClass could not be converted to string
$res = (string)$var;
$res = strval($var);
var_dump($res,$var);
- 永久转换
/**
* 强制类型转换
* 临时转换(string) strval()两种形式
* 永久转换,设置变量类型settype gettype
*/
$var = 123;
settype($var,'string');
echo gettype($var);//string
字符串转换成其他类型
// 取合法数字,如果不是以合法数字开始,转换成0
/*echo 1+"3king"; // 4
echo 1+"1.3a"; // 2.3
echo 1+"2e2"; //201
echo 1+"true";//1*/
// 字符串转换成布尔类型的规律,空字符串或者空字符串"0"转换成false
$res = ''; //false
$res = ' '; // true
//$res = 0; //false
//$res = '0'; // false
//$res = 0.0; //
//$res = '0.0'; // true
//$res = null;//false
//$res = "false"; //true
//$res = []; //false
if($res){
echo "$res 是真的";
}else{
echo "$res 是假的";
}
字符串函数库的使用
字符串长度、字符串查找、字符串大小写转换、字符串截取、字符串ASCII码、加密、比较、拆分、合并、格式化字符串、其他常用
字符串长度
strlen($string):得到字符串长度
// 检测变量是否是字符串
$str = "Hello";
var_dump(is_string($str)); // bool(true)
//得到字符串的长度
var_dump(strlen($str)); // 5
字符串大小写
strtolower(string):返回大写之后的字符串
ucfirst(string):单词的首字母大写
lcfirst($string):字符串的单词的首字母小写
$str = "Hello";
//转换成小写
echo strtolower($str);//hello
// 转换成大写
echo strtoupper($str);//HELLO
//首字母大写
echo ucfirst($str);//Hello
$name = 'i love you';
// 所有单词首字母大写
echo ucwords($name); //I Love You
// 字符串的首字母小写
echo lcfirst($str); // hello
字符ASCII
ord(ascii):根据ASCII得到指定的字符
echo ord('a'); // 97
echo ord('z'); // 122
echo ord('A'); //65
echo ord('Z'); // 90
echo chr(122); // z
字符串的截取
- substr(start[,$length]):截取字符串
$str = 'abcdef';
echo $str{0};//a
// 如果start为负值,代表的位置
echo substr($str,0,1); // a
echo substr($str,2);//cdef
echo substr($str,-2,2);//ef
echo substr($str,-4,-2);//cd
echo substr($str,0,-3);//abc
- mb_substr 中文截取,mb,多字节的意思
$str = '我ai中国';
echo mb_substr($str,0,4); // 我ai中
substr_replace(replace,length]):替换字符串的子串
$str = '[email protected]';
echo substr_replace($str,'2',0,1); //[email protected]
比较字符串的大小
strcmp(string2):比较两个字符串的大小,比较的时候区分大小写
strcasecmp(string2):忽略大小写的比较字符串的大小
echo strcmp('a','b'); // -1
echo strcmp('a','A');//1
echo strcmp('aa','aA'); // 1
echo strcmp('a','a'); //0
echo strcasecmp('a','A');//0
字符串查找
strpos(search[,string,offset]):忽略大小写的去查找,i---ignore
strrpos(search[,string,offset]):忽略大小写的去查找最后一次出现的位置
$str = '[email protected]';
echo strpos($str,'@');//1
echo strpos($str,'Q');//3
echo strpos($str,'qq');//false 空字符串
echo strpos($str,'qQ');//2
echo stripos($str,'Q');//2
echo strrpos($str,'c');//6
echo strripos($str,'c');//7
strstr|strchr(search[,string,before_needle]):忽略大小写的去查找,返回字符串
strrchr(search):查找指定字符在字符串中的最后一次出现
str_replace(replace,search,string):忽略大小写的去查找并替换
$str = '[email protected]';
echo strstr($str,'@');//@qQ.ccCom
echo strstr($str,'Q');//Q.ccCom
echo strchr($str,'qq');//false 空字符串
echo strchr($str,'qQ');//qQ.ccCom
echo stristr($str,'Q');//qQ.ccCom
echo strrchr($str,'c');//cCom
echo str_replace('qQ','qq',$str);//[email protected]
echo str_ireplace('qq','qq',$str); //[email protected]
- preg_match_all 正则匹配所有
$str = 'php is very php js';
echo preg_match_all('/php|js/',$str,$arr); // 3
print_r($arr);
Array
(
[0] => Array
(
[0] => php
[1] => php
[2] => js
)
)
- preg_match匹配第一个
$str = 'php is very php js';
echo preg_match('/php|js/',$str,$arr); // 1
print_r($arr);
Array
(
[0] => php
)
字符串过滤
trim(charlist]):默认过滤字符串两端的空格,也可以过滤指定字符串
ltrim(charlist]):过滤字符串左端
rtrim|chop(charlist]):过滤字符串右端
$str = ' com ';
echo trim($str); //com
echo ltrim($str);//com
echo trim($str,' c'); //om
strip_tags(allowTag]):过滤字符串中的HTML标记
$a = '123
';
echo strip_tags($a);//123
addslashes($string):使用反斜线引用字符串中的特殊字符
$str = "Is \your name O'reilly?";
// 输出: Is your name O\'reilly?
echo addslashes($str);
htmlentities(flag=ENT_COMPAT]):将所有字符转换成HTML实体
bold";
// 输出: A 'quote' is <b>bold</b>
echo htmlentities($str);
// 输出: A 'quote' is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
?>
htmlspecialchars(flag=ENT_COMPAT]):将字符串中的特殊字符转换成HTML实体
Test", ENT_QUOTES);
echo $new; // <a href='test'>Test</a>
?>
nl2br($string):将字符串中的\n用
替换
echo nl2br("foo isn't\n bar");
/**
* foo isn't
bar
*/
加密
md5(string):计算字符串的sha1的散列值,返回40位长度的字符串
均为不可逆的加密
字符串分隔成数组
- explode(string):使用一个字符串分割另一个字符串
$str = 'I love you';
print_r(explode(' ',$str));
Array
(
[0] => I
[1] => love
[2] => you
)
- preg_split正则分隔:通过一个正则表达式分隔字符串
$str = '2020-01_05';
print_r(preg_split('/-|_/', $str));
Array
(
[0] => 2020
[1] => 01
[2] => 05
)
- str_split:按长度分隔
$str = '12345678910';
print_r(str_split($str, 3));
Array
(
[0] => 123
[1] => 456
[2] => 789
[3] => 10
)
数组合并成字符串
implode|join(array):以指定分隔符将数组中的键值连接成字符串
- implode — 将一个一维数组的值转化为字符串
$arr = array('I', 'love', 'you');
$str = implode(" ", $arr);
echo $str; // I love you
- join implode的别名
字符串替换
- str_replace 字符串替换
$str = 'php is very php';
echo str_replace('php','linux',$str); // linux is very linux
- preg_replace 正则替换
$str = 'php is very php js';
echo preg_replace('/php|js/','linux',$str); // linux is very linux linux