本周学习知识点:
一.PHP字符串处理函数
二.正则表达式
三、PHP中文件系统处理
四、文件的上传下载
一.PHP字符串处理函数
1. 字符串函数
A、常用的字符串输出函数
echo(): 输出一个或多个字符串
print() 效率比echo低,用的少
print_r() 打印关于变量的易于理解的信息。
die() exit;直接退出,exit的别称die()输出一些文字再退出
Print_r() ------输出:输出到浏览器端的
Var_dump()----打印:获得一个变量的详细信息
B、格式化输出:返回格式化的字符串
printf() 打印格式化后的文字
sprintf() 返回格式化的文字,但不打印
C、字符串格式化函数
trim() 去除字符串首尾处的空白字符
ltrim() 删除字符串开始的空白字符
rtrim() 删除字符串结束的空白字符 -----别名:chop()
D、字符串填充函数
stringstr_pad( string $input , int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT ]] )
参数1,填补之后的数量,
参数2,用什么填补;
参数3,填补的位置
E、大小写转换的函数
strtoupper() 将字符串全部转化为大写
strtolower() 将字符串全部转化为小写
ucfirst() 字符串首字母大写
ucwords() 每个单词的首字母大写
F、HTML标签相关的字符串
1.nl2br() 在字符串所有新行之前插入HTML换行标记
stringnl2br( string $string [, bool $is_xhtml = true ] )
2.strip_tags — 从字符串中去除 HTML 和 PHP 标记(不允许用户输入html标签)
stringstrip_tags( string $str [, string $allowable_tags ] )
HTML标签相关的函数,为了防止黑客攻击,尽量将表单提交过来的数据使用 strip_tags()
htmlspecialchars() 过滤一下,特殊字符转换为HTML实体
G、其他字符串格式化函数
货币:number_format() 数字以千计格式分组数
Strrev() 字符串翻转函数
stringstrrev( string $string )
Md5() 加密函数
stringmd5( string $str [, bool $raw_output = false ] )
H、字符串比较函数
strcmp — 二进制安全字符串比较
intstrcmp( string $str1 , string $str2 )
如果第一个数大于第二个返回正数,如果小于返回负数,如果相等返回0 注意该比较区分大小写。
strcasecmp() 忽略大小写之后再做比较
strnatcmp() 按照自然排序
I、字符串分割函数
explode(arg1,arg2) 参数1,分隔符;参数2,待分割的字符串
implode() 将数组元素连接成字符串
chunk_split() 将字符串分割成小串
split() 用正则表达式将字符串分割到数组中
preg_split() 用正则表达式分割字符串
str_split() 将字符串转换成数组
Eval 计算一个字符串作为PHP代码
mixed eval( string $code_str )
二、PHP正则表达式
A、正则表达式函数:
Perl 兼容正则表达式函数、POSIX 扩展正则表达式函数
Perl兼容其他语言,而且在POSIX的基础上做了扩展,功能更强大
如果能用字符串函数处理的就不用正则表达式,因为函数要比正则表达式效率高,正则表达式只处理复杂的字符串
B、正则表达式语法:
1) 定界符 / /
2) 原子: \s 是正则表达式匹配的最基本单位
3) 元字符: * + ? 特殊意义的字符
4) 模式修正符 i u
C、表示范围的原子
\d 匹配任意一个十进制数字
\D 除了十进制数字之外的任意字符
\s 匹配任意一个空白字符 空格、回车、换行
\S 匹配任意非空白字符
\w 匹配任意一个字 a-z A-Z _ 0-9
\W 字母数字下划线之外的任意一个字符
\b 表示一个边界
\B 表示一个非边界
D、自定义范围
[] 自定义一个原子表,匹配方括号中的任意一个原子
- 表示一个范围
^ 表示取反,除了原子表中的都可以(必须在[]内,第一个字符处出现)
E、元字符
匹配原子出现的数量 * + ?
* 0 、1、多次 + 1、多次 ? 0、一次
{} 自己定义前面的原子出现的次数
F、特殊的元字符
. 匹配除了换行符外的任意字符
^ 在正则表达式的第一个字符出现,表示以 xx 开始
$ 在正则表达式的最后一个字符出现,表示以 xxx结束
| 表示或的关系,由于优先级最低所以最后才考虑他
G、 ()括号
1.改变优先级
2. 作为子模式匹配,将全部匹配作为一个大模式,放到数组的第一个元素中,每个()作为一个子模式,依次放到数组中
3.反向引用
可以在模式中将子模式直接取出,再作为正则表达式模式的一部分使用
\1 取第一个子模式 \2 取第二个子模式
H、模式修正符
I 忽略大小写 m 将字符串以多行状态下匹配
S 将\n当做换行看待 U 非贪婪模式
PHP正则表达式默认是贪婪模式,有几个匹配几个 U非贪婪模式,匹配第一个后即停止
I、正则匹配案例
图片: "/<img.*?src=[\'|\"].*[\.jpg|\.png|\.gif][\'|\"].*?\/?>/i";
邮箱:"/^\w[\w-\.]*@\w+\.?\w*(\.com|\.org|\.net)$/";
电话:"/(13[0-9]|14[0-9]|15[0-9]|18[0-9])\d{8}/"
Url:"/^http(s?):\/\/(www\.)?\S*$/"
三、PHP中文件系统处理
A、文件类型
is_dir() 判断是否是一个目录
is_executable() 判断文件是否可执行
is_file() 判断给定的是否是一个文件
is_link() 判断给定的是否是一个符号连接
is_readable() 判断给定的是否是可读的
is_writable() 判断文件是否可写
B、文件属性
file_exists() 文件是否存在
filesize() 文件大小
filectime() 文件创建时间
filemtime() 文件修改时间
fileactime() 文件访问时间
C、缓存文件
<?php
$cache = 5;
$cache_file = "cache.txt";
if(file_exists($cache_file) &&(time()-filemtime($cache_file))<$cache){
echo file_get_contents($cache_file).'<br/>';
}else{
file_put_contents($cache_file,date("Y-m-d H:i:s",time()));
}
缓存的使用:
由于多个人、多次访问一个页面的时候,需要反复的查询数据库,速度非常慢,所以,我们可以第一个人第一次访问这个页面的时候,连接数据库一次,将数据缓存起来,其他人在访问的时候,直接读取缓存文件的数据,提高速度
Date() 可以将时间戳转换成格式良好的 时间格式
第一个参数,时间格式
第二个参数,时间戳
D、目录分割符
目录分隔符:
在Linux操作系统下,目录分割符是 /
在Windows操作系统下,目录分割符石 \
D:\mywamp\www\php_review\File
但是,不管在什么操作系统下,PHP都支持 / 作为目录分隔符
E、路径相关的函数
Basename() 获得文件名
Dirname() 获得目录名
Pathinfo()获得文件详细信息(返回数组)
F、文件操作相关函数
创建文件touch();
删除文件 unlink()
移动文件rename(‘当前路径名’,’目标文件名’);
复制文件copy(‘当前文件’,’目标文件名’);
重命名文件rename()
G、文件的读写操作
File_get_contents() 获取内容
File_put_contents() 写入内容
File()会将获得的文件所有的数据将每一行放到一个数组元素中
fopen() 返回值为资源
feof() 判断文件指针是否到了文件末尾
fread(“指针”,长度) 读取文件内容
fwrite() 写入文件
fclose() 关闭文件资源
fgetc() 一次读取一个字符
fgets() 一次读取一行字符
I、文件的处理:
保存数据:
当PHP脚本文件执行完毕,里面所有的变量都会被释放,有些重要的数据可以保存到数据库中,也可以保存到文件中(电脑的硬盘中)
缓存文件:
访问一个网站的速度:从数据库获得数据,在前台页面显示速度最低---->缓存文件
从数据库获取 < 缓存文件 < 内存缓存 < CPU(电脑的硬件中)
K、文件内部移动指针
ftell() 返回当前文件指针的位置
fseek() 在文件指针中定位
fseek($file,15,SEEK_CUR); 设定位置为当前位置加上 offset
rewind($fil;e) 回到文件头部
四、目录相关函数
mkdir — 新建目录
bool mkdir ( string $pathname [, int $mode [, bool $recursive [, resource $context ]]] )
rmdir — 删除目录
bool rmdir ( string $dirname )
scandir — 列出指定路径中的文件和目录
array scandir ( string $directory [, int $sorting_order [, resource $context ]] )
默认的排序顺序是按字母升序排列。如果使用了可选参数 sorting_order(设为 1),则排序顺序是按字母降序排列。
getcwd — 取得当前工作目录
string getcwd ( void )
学习总结:
一、正则表达式匹配天气预报
//抓取内容
$arr=file_get_contents("http://www.weather.com.cn/html/weather/101090201.shtml");
//正则表达
$arr = preg_replace('/[\r|\n]/','', $arr);
$pattern="/<div\sclass=\"weatherYubaoBox\">.*<\/div>/imU";//
//进行正则表达式匹配
preg_match($pattern,$arr,$match);
echo "<pre>";
print_r($match);
echo "</pre>";
二、单引号、双引号区别:
1. 双引号解析变量
2. 单引号里面 不能直接输出转义字符
$str = "hello\nworld";
3. 单引号里面只能转义单引号;双引号里面只能转义双引号
\n ----代表换行;在Linux/Unix 操作系统下,换行的意思;在windows操作系统下,只是一个空白
三、PHP正则表达式中() 的使用
1. 改变优先级
<?php
$str = "catdog";
//()会将里面的作为一个整体
//由于| 优先级比较低,匹配的是cat dog而不是 t|d
$pattern = "/ca(t|d)og/";
preg_match($pattern,$str,$match);
var_dump($match);
2. 作为子模式存在
<?php
//()作为子模式使用
$str = "helloaaaaahhsdfssasssss";
//将连续出现5次的字母提取出来
$pattern = "/\w{5}/"; //字母数字下划线 \w(a-zA-Z)0-9_ \d \s \b \f
$pattern = "/(\w)\\1{4}/";//反向引用 在正则表达式中使用前面的匹配的子模式,使用第一个子模式 \1 使用第二个子模式 \2 以此类推
preg_match($pattern,$str,$match);
var_dump($match);
四、正则表达式相关的函数:
Preg_match()--------正则表达式匹配
Preg_match_all()----全局匹配(将所有符合规则的都匹配到)
<?php
$date = "today is 10:39 2013-10-14,tomorrow is 10:39 2013-10-15, houtian is 10:39
2013-10-16";
$pattern = "/\d{2}\W\d{2}\s\d{4}\W\d{2}\W\d{2}/";
preg_match($pattern,$date,$match);
echo '<pre>';
print_r($match);
echo '</pre>';
echo '<br/>';
preg_match_all($pattern,$date,$match);
echo '<pre>';
print_r($match);
echo '</pre>';
Preg_grep() 返回符合规则的数组元素(单元)过滤数组元素
<?php
$arr = array('New York','London','Beijing','Tokyo');
$pattern = "/^\w\S*\w$/";
//会依次将数组的元素和正则表达式匹配,匹配到的结果会保存到一个新的变量中
$new_arr = preg_grep($pattern,$arr);
echo '<pre>';
var_dump($new_arr);
echo '</pre>';
Preg_quote() 转义正则表达式字符
<?php
//转义正则表达式字符/符号
$str = "^he\$llo $ \nworld$";
$new_str = preg_quote($str);
print_r($new_str);
Preg_split() 通过正则表达式拆分字符串
<?php
//拆分字符串
$str = "stay hungry,stay foolish!stay here";
$pattern = "/[\s,!:?]/";//[] 表示里面范围的任何一个
$new_arr = preg_split($pattern,$str); //会根据正则来将字符串拆分成一个数组
print_r(array_count_values($new_arr));
echo '<br/>';
echo count($new_arr);
echo '<br/>';
print_r($new_arr);
Preg_replace() 通过正则表达式 替换字符串
<?php
//正则表达式替换
$str = "October 14,2013";
$pattern = "/(\w+\s\d{2})\W(\d{4})/"; //反向引用 \1 第一个子模式 \2第二个子模式 ....
$replacement = "$1(hello),$2(year)"; //在其他地方怎么引用子集 $1引用第一个子集 $2 第二个子集...
$new_str = preg_replace($pattern,$replacement,$str);
//参数1,正则,参数2,替换目标,参数3,在那个字符串中进行替换
print_r($new_str);
五、抓取某网站所有的图片
?: 取消子模式
<?php
$content = file_get_contents('http://www.youkuaiyun.com/');
$pattern="/<[img|IMG].*?src=[\'|\"].*(?:[\.gif|\.jpg|\.png])[\'|\"].*?\/?>/";
preg_match_all($pattern,$content,$matches);
echo '<pre>';
print_r($matches);
echo '</pre>';
六、综合练习,文件类型、文件属性:
<?php
date_default_timezone_set("PRC");
function checkFileType($filename){
if(file_exists($filename)){
if(is_dir($filename)){
echo "这是一个目录".'<br/>';
}
if(is_file($filename)){
echo "这是一个文件".'<br/>';
echo "文件的大小是:".getFileSize(filesize($filename)).'<br/>';
}
if(is_readable($filename)){
echo "这个文件可读".'<br/>';
}
if(is_writable($filename)){
echo "这个文件可写".'<br/>';
}
if(is_executable($filename)){
echo "这个文件可执行".'<br/>';
}
echo "这个文件创建时间:".date('Y-m-d H:i:s',filectime($filename)).'<br/>';
echo "这个文件修改时间:".date('Y-m-d H:i:s',filemtime($filename)).'<br/>';
echo "这个文件最后被访问的时间:".date('Y-m-d H:i:s',fileatime($filename)).'<br/>';
}
}
function getFileSize($filesize){
if($filesize>=pow(2,40)){
$danwei = "TB";
$size = round($filesize/pow(2,40),2);
}else if($filesize>=pow(2,30)){
$danwei = "GB";
$size = round($filesize/pow(2,30),2);
}else if($filesize>=pow(2,20)){
$danwei = "MB";
$size = round($filesize/pow(2,20),2);
}else if($filesize>=pow(2,10)){
$danwei = "KB";
$size = round($filesize/pow(2,10),2);
}else{
$danwei = "Byte";
$size = $filesize;
}
return $size.$danwei;
}
checkFileType("test.txt");
七、递归删除一个目录, 将一个目录中所有的子目录以及文件都删除
$dirname = "test";
deleteDir($dirname);
function deleteDir($dir){
//如果文件/目录存在
if(file_exists($dir)){
if(is_file($dir)){
echo "这是一个文件,我不删除";
exit;
}else{
//这是一个目录
//先打开这个目录
$resorce = opendir($dir);
while($file = readdir($resorce)){
if($file!='.' && $file!= '..'){
$filename = $dir.'/'.$file;
if(is_dir($filename)){
//再去递归的打开、删除
deleteDir($filename);
}else{
//文件可以直接删除
unlink($filename);
echo "删除文件{$file}成功<br/>";
}
}
}
}
closedir($resorce); //先关闭资源、再删除文件
rmdir($dir);
echo "删除目录成功<br/>";
}
}
八、经典递归案例
<?php
//阶乘(递归)
/*
5!=5*4!
4!=4*3!
3!=3*2!
2!=2*1!
1!=1
*/
function jc($num){
if($num==1){
return 1;
}else{
return $num*jc($num-1);
}
}
jc(3);
/*
*序列:1 1 2 3 5 8 13 21。。。。。
*位置:1 2 3 4 5 6 7 8 9。。。。。
*/
function shu($num){
if($num==1||$num==2){
return 1;
}else{
return (shu($num-1)+shu($num-2));
}
}
echo shu(5);