字符串
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
/*
字符串在讲变量的时候已经讲了,怎么又要讲?
答:之前,只是介绍字符串这种变量类型,
但对于其定义,性质,函数等等,没有深入的说.
第2: 字符串,在PHP中,是非常非常重要的一个概念.
可以这么说: 你在开发网站中,想对字符串做某种操作.
基本上你想到的字符串的处理功能,系统都已有相关函数了.
因为PHP自诞生之初,就是为WEB开发而来的,
因为网站开发中,字符串处理 ,是PHP的一大亮点.
第3: 字符串在开发和面试时,也是最频繁用到的.
PHP中,1是字符串,2是数组函数,都非常多,非常好用.
*/
/*
什么是字符串?
答:字符串,就是一串字符
羊肉串就是一串羊肉.
*/
/*
1:如何声明一个字符串变量
答:
双引号
单引号
定界符
*/
$str1 = "hello";
echo $str1,'<br />';
// $str2 = "hello,"jack" "; // 这个字符串,是一个新闻标题,标题里很容易又出现双引号.
/**
思考:
用双引号,来声明字符串的时候,
内部不能再出现双引号,
因为,双引号被当成字符串的"边界"来对待,
因此,内部出现双引号,就引起了解释上的歧义.
这时,可以用转义字符,
即,用\" 转义 来表示 "
还有没有其他的转义字符呢?
想: \", 被用来当成 " 理解了.
那我要是确实想表示 反斜线\, 又怎么办呢?,
答: 用\\, 表示 反斜线\
还有没有其他的转义字符呢?
答:有
\n, \r, \$,等
\n 转义成 换行符
\r 转义成 回车符
**/
$str2 = "hello ,\"jack\",<br />";
echo $str2;
$str3 = "hello \\";
echo $str3,'<br />';
$str4 = "hello\n\r\n\r\n\rworld";
echo $str4,'<br />';
$str5 = "hello $str3";
echo $str5,'<br />'; // hello hello \, 即把$str3当变量给解析出来
$str6 = "world \$str3"; //此处 \$被转成了普通字符串$,而不再理解为变量标志.
echo $str6;
// 再看单引号
$str1 = 'hello';
echo $str1,'<br />';
// $str2 = 'hello 'jack''; // 某字符串是新闻标题,标题又出现单引号,
// 单引号里又出现的单引号怎么办呢?
// '被用来做字符串的边界了,
// 因此,串内想出现',只好用转义来表示
$str2 = 'hello \'jack\'';
echo $str2,'<br />';
// \被用来转义单引号用了,那么如果我确实想表示\,怎么办呢.
// \\ 来 表示 \
$str3 = 'hello \\';
echo $str3;
// 常见的面试题
// 1:单双引号定义字符串有何区别?
$age = 29;
$str1 = 'hello \n\r \t $age';
$str2 = "hello \n\r \t $age";
echo $str1,'<br />',$str2;
/*
转义上的区别:
单引号,系统不做复杂的转义,
只转义\',\\, 其他的---一律原样输出.
双引号,则转义的比较多,\",\\,\r,\n,\t,\$等.
对于变量解释的区别:
单引号,不对字符串的$作变量名解析,
而双引号,会试着$理解成变量名,来解析.
*/
// 2:单双引号定义字符串,哪个速度更快一些?
// 答:单引号解析的更快,因为不需要进行过多的转义和变量解析
// 问:什么时间选用单/双引号呢?
/*
答:大段文本,比如新闻标题,文本内容,自我介绍等这样大段话,
用',解析快.
但有时候,确实需要在一段字符串夹杂变量,
比如拼凑sql语句时
$id = 5;
$sql = "select * from user where id = $id";
// 如果此时用单引,则语句成为了 ..id= $id,sql就出错了.
// 此时,用双引合适. 解析$id,语句解析成 ..id = 5;
*/
// 当需要写一大段文本,好多行,里面又有单引号,又有双引号,导致转义的时候,都比较麻烦.
// 还可以用heredoc, nowdoc两种界定字符串的方式
$age = 29;
$str = <<<cont
我来写一行,
再来第2行, ' " \,
dsafd abc \t \r\n haha
$age
cont;
echo $str;
/**
heredoc的写法
<<<标识符
中间写大段的文本
标识符;
注意:
1:标识符的名称和变量名的要求一样.
2:heredoc的标识符,一定是独占一行,而且前面没有任何其他字符.
3:heredoc对文本的处理,和 双引号一样,即\r\n\t,变量,等,能解析出来.
**/
// heredoc写大段文本挺方便,但是对内部的字符解析,和双引号一样.
// 如果我不想这样,有没有类似heredoc写大段文本,
// 但是,对文本的解析又像 单引号那样简单.
// 有没有这样的用法呢?
// 答: 有
// 到了5.3.0之后, 又新增了nowdoc方式,能达到如上效果.
echo '<hr />';
$str = <<<'cont'
我来写一行,
再来第2行, ' " \,
dsafd abc \t \r\n haha
$age
cont;
echo $str;
/***
nowdoc写法和heredoc一样,唯独在标识符两边用单引号包起来,
这样,大段文本的解析,就和单引号一样的效果.
不转义 \n \r \t,变量等等
***/
/*
字符串函数讲解
PHP中,字符串函数非常非常多,
在此,归为9类,
每类,有代表的讲解1-2个.
严重警告同学们:
务必把老师PPT上列出的字符串函数练习遍.
同时,也学会看手册.
*/
$str = 'hello';
echo 'hello有',strlen($str),'个字节';
echo '<br />';
$str2 = '中国';
echo '中国有',strlen($str2),'个字节';
/**
为什么"中国"是6个字节呢?
我们的.php文件,是utf-8编码.
中文在utf-8编码规则中,一个中文,占3个字节.
因此,'中国'占6个字节.
**/
$str = "中华民国";
echo '字节长度是',strlen($str),'<br />'; // 12
echo '字符长度是',mb_strlen($str,'utf-8'),'<br />';
/**
要知道,编码都是有规律的,
utf-8有utf-8的规律,
你告诉mb_strlen,用utf8的规则来判断字符串,
判断出是4个字符.
**/
/*
strlen 是计算字符串"字节"长度
mb_strlen,是根据编码,计算字符串的"字符"个数.
*/
// 查找字符串中子字符串的位置
$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';
// 经理说: 你能否找找,这段字符串里,有没有'fine'
echo strpos($str,'fine'),'<br />'; // 13,经过13字节后,找到了fine
var_dump(strpos($str,256)); // 没找到,false
var_dump(strpos($str,97)); // 97找到了,返回值是4
/**
在计算机里,ascii字符集中
65 -> 90 , A-Z
97 -> 122 , a-z
当你第2个参数,写的是整型时,则把理解为是ascii字符的编码
所以 int 97 === 'a';
不熟悉ascii的,百度"ascii 码表"
**/
// 第3个参数offset的讨论
echo strpos($str,'fine'),'<br />'; // 13,经过13字节后,找到了fine
// 经理又说话了, 这个fine,还有没有fine???
// 第3个可选参数,offset的作用,就体现出来了.
// offset 的意思是 ---偏移量.
// 就是说,把光标先偏移一段距离,再查找,别从头查找.
echo strpos($str,'fine',17),'<br />';
// 1:写一个函数,判断指定的父串中,有没某子串
function findsub($str,$find) {
if(strpos($str,$find)){
return true;
} else {
return false;
}
}
function findsub2($str,$find) {
if(strpos($str,$find) === false){
return false;
} else {
return true;
}
}
$title = 'today is sunny';
if(findsub($title,'is')) {
echo '有is子串<br />';
} else {
echo '没有is子串<br />';
}
/*
下面这个判断,出问题了,
因为strpos返回了0, 而0用if判断时,当成false来处理的.
*/
if(findsub($title,'today')) {
echo '有today子串<br />';
} else {
echo '没有today子串<br />';
}
if(findsub2($title,'today')) {
echo '有today子串<br />';
} else {
echo '没有today子串<br />';
}
// 用for循环或者while循环, 配置strpos
// 计算某父串中, 子串出现的个数?
/*
函数名 subnum
参数: string $str 待查父串,
string $sub,子串
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 += 1;
$offset += $sublen;
}
/* 如果你熟悉for循环,可以这么写
for($offset = 0,$num=0;($offset = strpos($str,$sub,$offset))!==false;$num += 1,$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'),'个fine';
echo '<br />';
/*
知识综合起来,就能发挥比较大的作用,
此处用的for循环 + strpos, 计算子串的个数
*/
echo '我也找到',substr_count($str,'fine'),'个fine';
/*
这是为什么让大家重视字符串,
PHP的字符串太强大了.
你要是不了解,可能会多花冤枉时间,费力写出一个函数来,结果,本来就有.
*/
浙公网安备 33010602011771号