三、PHP 字符串处理
PHP 的字符串处理功能非常强大,主要包括:
字符串输出
echo():输出一个或多个字符串
print():输出一个字符串
printf():输出格式化字符串
字符串去除
trim():去除字符串 首尾 空白等特殊符号或指定字符序列
ltrim():去除字符串 首 空白等特殊符号或指定字符序列
rtrim():去除字符串 尾 空白等特殊符号或指定字符序列
chop():同 rtrim()
字符串连接
implode():使用字符将数组的内容组合成一个字符串
join():同 implode()
案例:
<?php
$array = array('姓名', '电话', '电子邮箱');
$char = implode("^", $array);
echo $char; //姓名^电话^电子邮箱
?>
字符串分割
explode():使用一个字符串分割另一个字符串
str_split():将字符串分割到数组中
案例:
<?php
$str = 'one|two|three|four';
print_r(explode('|', $str));
print_r(explode('|', $str, 2));
// 负数的 limit(自 PHP 5.1 起)
print_r(explode('|', $str, -1));
?>
字符串获取
substr():从字符串中获取其中的一部分
strstr():查找字符串在另一个字符串中第一次出现的位置,并返回从该位置到字符串结尾的所有字符
subchr():同 strstr()
strrchr():查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符
案例:
<?php
echo substr('abcdef', 1); //输出 bcdef
echo substr('abcdef', 1, 2); //输出 bc
echo substr('abcdef', -3, 2); //输出 de
echo substr('abcdef', 1, -2); //输出 bcd
?>
<?php
$email = '
[email protected]';
$domain = strstr($email, '@');
echo $domain;
// 输出 @5idev.com
?>
字符串替换
substr_replace():把字符串的一部分替换为另一个字符串
str_replace():使用一个字符串替换字符串中的另一些字符
案例:
<?php
$email = '
[email protected]';
$domain = strstr($email, '@');
echo $domain;
// 输出 @5idev.com
?>
<?php
echo str_replace("world","earth","Hello world!");
//输出 Hello earth!
//替换多个,且第二个参数为空字符
echo str_replace("o","","Hello world!");
//输出 Hell wrld!
//使用数组
$arr = array("e", "o");
$arr2 = array("x", "y");
echo str_replace($arr, $arr2, "Hello World of PHP", $i);
//输出 Hxlly Wyrld yf PHP
echo $i;
//输出4
?>
字符串计算
strlen():取得字符串的长度
strpos():定位字符串第一次出现的位置
strrpos():定位字符串最后一次出现的位置
案例:
<?php
$str = "This function returns the last occurance of a string";
$pos = strrpos($str, "st");
if($pos !== FALSE){
echo '字串 st 最后出现的位置是:',$pos; //字串 st 最后出现的位置是:46
} else {
echo '查找的字符串中没有 in 字串';
}
?>
字符串 XHTML 格式化显示
nl2br():将换行符 n 转换成 XHTML 换行符 <br />
htmlspecialchars():把一些特殊字符转换为 HTML 实体
转换的特殊字符如下:
& 转换为 &
" 转换为 "
< 转换为 <
> 转换为 >
htmlspecialchars_decode():把一些 HTML 实体转换为特殊字符,htmlspecialchars() 的反函数
转换的实体如下:
& 转换为 &
" 转换为 "
< 转换为 <
> 转换为 >
案例:
<?php
echo htmlspecialchars('<a href="test">Test</a>');
?>
字符串存储(转义)
addslashes():对特殊字符加上转义字符。
stripslashes():addslashes() 的反函数。
PHP 字符串存储(转义)
PHP 的字符串向数据库进行写入时,为避免数据库错误,需要对特殊字符进行转义(字符前加上 符号)。如 O'reilly 转义成 O'reilly,这样可以将数据放入数据库中,而不会插入额外的 。
这些特殊字符包括:单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
案例:
<?php
$str = "Is your name O'reilly?";
echo addslashes($str);
// 输出:Is your name O\'reilly?
?>
提示
默认情况下,PHP 指令 magic_quotes_gpc 为 on,系统会对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes() 。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes() ,因为这样会导致双层转义。
<?php
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
echo $lastname;
//转义后的字符如:O'reilly
?>
<?php
$str = "Is your name O\'reilly?";
echo stripslashes($str);
// 输出:Is your name O'reilly?
?>
判断是否为中文
可以根据中文的ASCII大于127来判断
$num = strlen($str);
for($i=0;$i<$num;$i++){
if(ord(substr($i,$i+1)) > 127){
echo substr($i,$i+2)."为中文";
$i = $i+1;
}
}
二、php 数组函数
数组的概念
数组(array)是 PHP 中一个非常重要的概念,我们可以把数组看做一系列类似的数据的集合,实际上数组是一个有序图
案例1:
PHP 打印输出数组内容及结构 print_r 与 var_dump 函数
案例2:
PHP is_array() 检测变量是否是数组
案例3 PHP 计算数组中的单元数目或对象中的属性个数 count 函数
在实际应用中,经常会根据数组的大小来进行一些循环操作,建议将 count() 写在循环体外:
<?php
$arr_age = array(18, 20, 25);
$count = count($arr_age);
for($i=1;$i<=$count;$i++){
echo "第 $i 次循环";
}
?>
案例4:PHP 检查数组中是否存在某个值 in_array 函数
案例5:PHP 检查给定的键名或索引是否存在于数组中 array_key_exists 函数
案例6:PHP 在数组中搜索给定的值 array_search 函数
<?php
$arr_a = array(0 => "a", 1 => "b", 2 => "c");
$key = array_search("a", $arr_a);
if( $key !== FALSE ){
echo "键名为:$key";
} else {
echo '无匹配结果';
}
//如果 needle 在 array 中出现不止一次,则返回第一个匹配的键。要返回所有匹配值的键,请使用 array_keys() 函数。
?>
案例7: PHP list() 将数组中的值赋给变量
PHP list() 用一步操作把数组中的值赋给一些变量。同 array() 一样,list() 不是真正的函数,而是语言结构。
<?php
$arr_age = array(18, 20, 25);
list($wang, $li, $zhang) = $arr_age;
echo $wang; //输出:18
echo $zhang; //输出:25
?>
案例8:
PHP 数组排序 sort、asort 及 ksort 系列函数
sort() 函数用于对数组单元从低到高进行排序。
rsort() 函数用于对数组单元从高到低进行排序。
asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
ksort() 函数用于对数组单元按照键名从低到高进行排序。
krsort() 函数用于对数组单元按照键名从高到低进行排序。
三、时间函数
格式化时间
date("Y-m-d",time());
//显示格式如 2008-12-01
date("Y.m.d",time());
//显示格式如 2008.12.01
date("M d Y",time());
//显示格式如 Dec 01 2008
date("Y-m-d H:i",time());
//显示格式如 2008-12-01 12:01
PHP 时间戳
UNIX 时间戳(timestamp)是 PHP 中关于时间日期一个很重要的概念,它表示从 1970年1月1日 00:00:00 到当前时间的秒数之和。
PHP提供了内置函数 time() 来取得服务器当前时间的时间戳。
案例1:
页面执行时间
计算当前页面执行时间的例子:
<?php
sleep(3); //停3秒
$running_time = time() - $_SERVER['REQUEST_TIME'];
echo '页面运行时间:',$running_time,' 秒'; //页面运行时间:3 秒
?>
<?php
$start=microtime(true);
//echo $start;
for($i=0;$i<=1000000;$i++){
}
echo '<hr />';
$end=microtime(true);
//echo $end;
echo '$end-$start'.($end-$start);
?>
案例2:
PHP 日期转换为时间戳 strtotime 与 mktime 函数
strtotime():函数用于将英文文本字符串表示的日期转换为时间戳,为 date() 的反函数,成功返回时间戳,否则返回 FALSE 。
mktime():用于从日期取得时间戳,成功返回时间戳,否则返回 FALSE 。
int mktime(时, 分, 秒, 月, 日, 年)
案例:
<?php
echo strtotime("2009-10-21 16:00:10");
//输出 1256112010
echo strtotime("10 September 2008");
//输出 1220976000
echo strtotime("+1 day"), "<br />";
//输出明天此时的时间戳
?>
<?php
echo mktime(21, 50, 55, 07, 14, 2010);
//输出“1279115455”
?>
案例3: 指定月的最后一天:
<?php
//任何给定月份的最后一天都可以被表示为下个月的第 "0" 天,而不是 -1 天,如下面的例子:
$lastday = mktime(0, 0, 0, 3, 0, 2008);
echo strftime("2008年最后一天是:%d", $lastday);
?>
案例4: 指定日期的下一天
$start = strtotime('2012-02-01');
$date = strtotime("-1 day", $start);//(counter)
echo date('Y-m-d',$date);
四、php文件函数:
PHP 提供了丰富的文件处理函数。文件处理主要包括:
file_exists:检查文件或目录是否存在。
file_put_contents:向文件写入内容,等同依次调用 fopen,fwrite 以及 fclose 函数。
file_get_contents:把 整个文件 读入一个字符串。
file:把 整个文件 读入一个数组中,数组中的每个单元都是文件中相应的一行。
is_readable:检查文件是否可读。
is_writable:检查文件是否是否可写入。
unlink:删除文件。
filesize:取得文件大小。
filetype:取得文件类型。
filemtime:取得文件修改时间。
is_file()
is_dir 函数:检查给定文件名是否为一个目录。
案例文件上传
件上传概述
文件上传功能是网络生活中经常使用的一个功能。使用 PHP 可以很方便的实现文件上传,其具体流程如下:
表单选择文件 -> 检查文件大小及类型 -> 生成临时文件 -> 移动临时文件至文件存储目录 -> 记录文件信息以便于管理。
在文件上传功能中,需要考虑以下几个问题:
限定上传文件的大小
限定上传文件的类型
只允许可信任的用户上传文件,防止远程提交
服务器端文件存储目录
对文件上传后的管理
HTML 表单
<form enctype="multipart/form-data" action="upload.php" method="post">
<label for="file">请选择上传的文件</label>
<input type="file" name="file" size="40" />
<br />
<input type="submit" name="submit" value="确定" />
</form>
$_FILES["file"]["name"]
客户端提交文件的原名称
$_FILES["file"]["type"]
浏览器提供的文件的 MIME 类型,如 gif 图片为 image/gif 。不过此类型在 PHP 端并不检查,因此不要想当然认为有这个值
$_FILES["file"]["size"]
已上传文件的大小,单位为字节
$_FILES["file"]["tmp_name"]
文件被上传后在服务端储存的临时文件名
$_FILES["file"]["error"]
和该文件上传相关的错误代码,为0则表示上传成功防止远程提交
<?php
//文件存储路径
$file_path="upload/";
//664权限为文件属主和属组用户可读和写,其他用户只读。
if(is_dir($file_path)!=TRUE) mkdir($file_path,0664) ;
//定义允许上传的文件扩展名
$ext_arr = array("gif", "jpg", "jpeg", "png", "bmp", "txt", "zip", "rar");
if (empty($_FILES) === false) {
//判断检查
if($photo_up_size > 2097152){
exit("对不起,您上传的照片超过了2M。");
}
if($_FILES["file"]["error"] > 0){
exit("文件上传发生错误:".$_FILES["file"]["error"]);
}
//获得文件扩展名
$temp_arr = explode(".", $_FILES["file"]["name"]);
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$file_ext = strtolower($file_ext);
//检查扩展名
if (in_array($file_ext, $ext_arr) === false) {
exit("上传文件扩展名是不允许的扩展名。");
}
//以时间戳重命名文件
$new_name = time().".".$file_ext;
//将文件移动到存储目录下
move_uploaded_file($_FILES["file"]["tmp_name"],"$file_path" . $new_name);
//向数据表写入文件存储信息以便管理
//*********** 代码略 ***********//
echo "文件上传成功!";
exit;
} else {
echo "无正确的文件上传";
}
?>
例子说明:
该例子只是简单演示了文件上传的流程,请勿直接用于实际项目
该例子中缺少对用户权限的检查
如果上传后的文件没有做重命名,则需要做文件重名时的逻辑处理
写入数据表文件信息由于涉及到数据库操作,暂略。写入数据表的信息应该包括文件上传的时间,上传的用户ID以及存储的位置,以便清理上传无效的文件以及文件过期管理等
无提交校验,要防止远程提交,可以在表单生成页面产生一个会话ID,然后在upload.php页面做校验以防止远程提交
PHP 目录处理函数主要包括:
mkdir():创建目录
is_dir():判断给定文件名是否是一个目录
rmdir():删除目录
basename():返回路径中的文件
dirname():返回路径中的目录
案例:
<?php
$dirname = 'testdir';
if (mkdir($dirname, 0700)) {
echo "目录 $dirname 创建成功";
} else {
echo "目录 $dirname 创建失败";
}
?>
遍历目录下面的所有为文件
if($handle = opendir('C:\\Inetpub\\wwwroot\\test\\')){
echo "Files:\n";
while (false !== ($file = readdir($handle))){
echo "$file\n";
}
closedir($handle);
}