PHP从零开始——学习笔记(二)

函数

可变函数

PHP支持可变函数的概念,就是说如果一个变量名后面有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。
可变函数代码示例:

<?php
function one() {
	echo "In one()\n";
}
function two($a = '') {
	echo "In two();argument was '$a'\n";
}
//使用echo的包装函数
function three($string){
	echo $string;
}
$b = 'one';
$b();
$b = 'two';
$b('test');
$b = 'three';
$b('test');
?>

加上运行结果,回头复习更加容易理解。
Augenstern

内部(内置)函数

PHP有很多标准的函数和结构,还有一些函数需要和特定的PHP扩展模块一起编译,否则在使用他们的时候,就会报错为“未定义函数”。
比如要使用image函数中的imagecreatetruecolor(),需要在编译PHP时加上适合的扩展模块。还有,要使用mysql_connect()函数,就需要在编译时加上mysql支持,

正则表达式

简单介绍

正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

定界符

我们一般使用正斜杠‘/’,来作为定界符,当然也可以使用其它的符号比如!!、##、{}、||定界符代表一个正则表达式的开始与结束。(必须是前后一致的)

<?php
$pattern = '/test/';
$str = 'abctestdhdantest';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
?>

preg_match_all()按照指定的正则表达式,在给定的字符串中进行搜索,匹配到符合特征的部分取出来。它有三个参数,第一个是需要搜索的字符串,第二个是给定搜索的字符串范围,第三个参数可填可不填。可以看下面这个示例(删除之后)

<?php
$pattern = '/test/';
$str = 'abctestdhdantest';
var_dump(preg_match_all($pattern, $str));
?>

运行结果是
Augenstern
通过代码,可以直观的看出来定界符的用法

普通字符

正则表达式里的普通字符。如a到z、A到Z、0到9、单引号、双引号。他们是没有特殊含义的。

元字符

元字符指的是在正则表达式中含有特殊含义的字符(不用背,用到时去查就OK)

常见的元字符

\d 匹配任意一个十进制数字,等价于【1-9】
\D 匹配任意一个除十进制数字以外的字符等价于【^0-9】
\s 匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、垂直制表符。
\S 匹配除空白字符以外任意一个字符
\w 匹配任意一个数字或字母或下划线
\W 匹配除数字、字母、下划线以外的任意一个字符
. 匹配除换行符以外的任意一个字符
* 匹配0次、或1次或多次其前面的字符,放在*前面的那个字符可以出现0次,也可以出现1次,也可以出现多次。
等等,
看下在代码中的作用,全放在一个代码中了。

<?php
$pattern = '/t\dst/';
$str ='ancasdst3stfdd';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
echo " <br />";
$one = '/t\Dst/';
$str1 = 'snfjdt@stkkksnc';
var_dump(preg_match_all($one, $str1, $arr1));
var_dump($arr1);
echo " <br />";
$two = '/t\sst/';
$str2 = 'sdst stffd';
var_dump(preg_match_all($two, $str2, $arr2));
var_dump($arr2);
echo " <br />";
$three = '/t\wst/';
$str3 = 'asdat_stgggd';
var_dump(preg_match_all($three, $str3, $arr3));
var_dump($arr3);
echo " <br />";
$four = '/t.st/';
$str4 = 'sgddht@stfgg';
var_dump(preg_match_all($four, $str4, $arr4));
var_dump($arr4);
echo " <br />";
$five = '/te*st/';
$str5 = 'hhdteeeeestfffds';
var_dump(preg_match_all($five, $str5, $arr5));
var_dump($arr5);
echo " <br />";
?>

Augenstern
元字符另外还有好多,
+匹配一次或者多次前面的字符。
?匹配一次或者零次前面的字符。
{n} 前面的字符出现次数等于n次。
{n,} 前面的字符出现次数不少于n次,也就是要大于等于n次。
{n,m} 前面的字符出现次数至少出现n次,最多出现m次。
|匹配两个或多个模式
[]匹配方括号中的任意一个字符
^或\A匹配字符串开始的位置
$或\Z匹配字符串结束的位置
[^]匹配除方括号中字符以外的任意一个字符。
()将括号中作为一个整体,以便将其中的内容获取到。
等等

元字符之间可以互相配合。

比如
.{n}配合。匹配n个任意字符。
.*配合。匹配任意字符多个。

<?php
$pattern = '/t.*t/';
$str ='ancasdst3fgfgfstfdddfjdkodt';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
echo " <br />";
?>

.*配合,默认情况尽可能多的匹配字符。(贪婪匹配)。
上面代码运行结果是
Augenstern
.*?配合,解决贪婪问题,

<?php
$pattern = '/t.*?t/';
$str ='ancasdst3fgfgfstfdddfjdkodt';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
echo " <br />";
?>

Augenstern
之前看过一个python爬虫的代码,就有正则表达式,其中还用到了.*?这个组合的元字符。之前还不懂是什么意思。

模式修正符

i 在和模式进行匹配时不区分大小写。
demo示例:

<?php
$pattern = '/test/i';
$str ='   test  TESt  Test  TeSt  ';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
echo " <br />";
?>

这个可以匹配到四个。此时大小写不区分。
m 多行匹配,如果目标字符串中没有‘\n’字符或者模式中没有出现^或$,设置这个修饰符不产生任何影响。
使用条件:
1.目标字符串中必须包含“\n”;并且,在字符串中,出现了“\n”,那么就表示新的一行的开始。
2.正则表达式中必须要出现^或$
demo示例:

<?php
$pattern = '/^test/m';
$str ="test\ntest\ntest\ntest";//注意这里使用双引号
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
?>

Augenstern
s此模式修正符设定后,则.将匹配所有的字符 ,包括换行符
U禁止贪婪匹配。
模式修正符也可搭配使用。

与正则表达式配合的函数

  • preg_match()执行一个正则表达式匹配,匹配0次或1次就停止。
    参数说明:
    第一个参数:正则表达式。
    第二个参数:目标字符串。
    第三个参数:放一个变量,执行完成之后,里面会有匹配到的部分以及等等一些数据。
    第四个参数:可以传PREG_OFFSET_CAPTURE进入(那么第三个参数那个变量里面就会有匹配到的部分的偏移值)默认传的是0
    第五个参数:可以传一个值,来表示从目标字符串的哪个位置开始搜索(单位是字节)。
    一个demo示例
<?php
$pattern = '/t(.*?)st/';
$str = 'adsashtest  tshahgcst   test   tschcbcgst   ';
var_dump(preg_match($pattern, $str,$arr));
var_dump($arr);
if(preg_match($pattern, $str,$arr,PREG_OFFSET_CAPTURE)){
	echo "找到了!<br />";
	var_dump($arr);
}else{
	echo "没找到!";
}
?>

运行结果
Augenstern

  • preg_match_all()
    参数说明:
    第四个参数:(可选)

PREG_PATTERN_ORDER
PREG_SET_ORDER
PREG_OFFSET_CAPTURE

偏移值的设定。

  • preg_replace()
    执行一个正则表达式的搜索和替换。
    参数说明:
    第一个参数:正则表达式
    第二个参数:要替换成的字符串
    第三个参数:目标字符串
    第四个参数(可选):默认是-1,就是替换所有符合特征的部分。
    第五个参数(可选):可以放一个变量。
    preg_replace传数组
    第一个参数和第二个参数传数组,一一对应的去替换

日期与时间

一、设置时区:一般设置上海的时区。
二、获取当前Unix时间戳
关于Unix时间戳:从格林威治时间1970年1月1日00时00分00秒开始到当前的秒数。用函数time()
三、获取指定时间的Unix时间戳
函数mktime()参数顺序(时,分,秒,月,日,年)
四、从Unix时间戳取得时间日期信息
函数:date()格式化一个本地时间。
参数,把format字符放在参数里面。
五、获取Unix时间戳和微妙数
函数microtime()

demo示例

上海时间:

<?php
date_default_timezone_set('Asia/Shanghai');//设置时区
var_dump(time());//获取当前Unix时间戳
echo "<br />";
echo mktime(0,0,0,10,1,2020);//自定义时间与日期
echo "<br />";
echo date('Y-m-d G:i:s');//格式化当前时间与日期。
echo "<br />";
echo microtime();
?>

运行结果:
Augenstern

图像处理

创建一个简单图像

创建图像

$img=imagecreatetruecolor(200, 200);//新建一个长和高都为200像素的真彩色图像

分配颜色

$color1=imagecolorallocate($img, 46, 219, 50);//分配颜色

填充颜色

imagefill($img, 0, 0, $color1);//填充颜色 

保存图像

imagejpeg($img);//保存图像 

销毁图像

imagedestroy($img); //销毁图像

想要在浏览器中显示,还要再加上一个header头,用来向浏览器解释这是个图片

header('Content-type:image/jpeg');//向浏览器说明这是个图片

这样就能在浏览器中看到效果图了
Augenstern

验证码

imagesetpixel()画一个单一像素
imageline()画一条线段
imagerectangle()画一个矩形
imagestring()水平的画一行字符串
imagettftext()用TrueType字体向图像写入文本
imagettfbbox()计算TrueType字体所占区域
imagecopy()拷贝图像的一部分
imagecopymerge()拷贝并合并图像的一部分
imagecopyresampled()重采样拷贝部分图像并调整大小
自制验证码demo

<?php
header('Content-type:image/jpeg');
$width=120;
$height=40;
$string='';
$element=array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
for ($i=0; $i <5 ; $i++) { 
	$string.=$element[rand(0,count($element)-1)];
}
$img=imagecreatetruecolor($width, $height);
$color_bg=imagecolorallocate($img, rand(200,255), rand(200,255), rand(200,255));
$color_border=imagecolorallocate($img, rand(200,255), rand(200,255), rand(200,255));
$color_string=imagecolorallocate($img, rand(10,100), rand(10,100), rand(10,100));
imagefill($img, 0, 0, $color_bg);
imagerectangle($img, 0, 0, $width-1, $height-1, $color_border);
for ($i=0; $i <100 ; $i++) { 
	imagesetpixel($img, rand(0,$width-1), rand(0,$height-1), imagecolorallocate($img, rand(10,100), rand(10,100), rand(10,100)));
}
for ($i=0; $i <3 ; $i++) { 
	imageline($img, rand(0,$width/2), rand(0,$height), rand($width/2,$width), rand(0,$height), imagecolorallocate($img, rand(10,100), rand(10,100), rand(10,100)));
}
imagettftext($img, 25, rand(-5,5), rand(5,15), rand(30,35), $color_string, 'font/HARLOWSI.TTF', $string);
imagejpeg($img);
imagedestroy($img);
?>

代码粗略解释
1.用数组来实现验证码文本内容,然后随机函数,拼接字母,组成一段验证码。
2.提前定义一个空的$string,不然会报错。
3.颜色采用RGB模式,个别函数用时查手册。
运行结果:
Augenstern

水印

打开服务器或网络文件中已经存在的GIF、JPEG、PNG、WBMP格式图像。
imagecreatefromjpeg()
imagecreatefrompng()
imagecreatefromgif()
imagecreatefromwbmp()
创建或打开失败的时候就会返回空字符串,并且输出一条错误信息。
imagesx()输出图片宽度
imagesy()输出图片高度
getimagesize()输出图像大小

文字水印

示例demo:

<?php
header('Content-type:image/jpeg');
$img=imagecreatefromjpeg('images/2.jpg');
$color=imagecolorallocate($img, 255, 0, 0);
$width=imagesx($img);
$height=imagesy($img);
$position=imagettfbbox(20, 0, 'font/HARLOWSI.TTF', 'Augendtern');

$stringwidth=$position[2]-$position[0];
imagettftext($img, 20, 0, $width-1-$stringwidth-10, $height-1-10, $color, 'font/HARLOWSI.TTF', 'Augenstern');
imagejpeg($img);
imagedestroy($img);
?>

效果如下:
Augenstern
水印大小、位置均可调,还可以设定它占图片宽和高的比例。

图片水印

找好当水印的图片,与要加水印的图片放在同一路径下。
Augenstern
demo示例:

<?php
header('Content-type:image/jpeg');
$img=imagecreatefromjpeg('images/2.jpg');
$watermark=imagecreatefromgif('images/2.gif');
$color=imagecolorallocate($img, 255, 0, 0);
$width=imagesx($img);
$height=imagesy($img);
$watermarkwidth=imagesx($watermark);
$watermarkheight=imagesy($watermark);
$position=imagettfbbox(20, 0, 'font/HARLOWSI.TTF', 'Augendtern');
$stringwidth=$position[2]-$position[0];
imagettftext($img, 20, 0, $width-1-$stringwidth-10, $height-1-10, $color, 'font/HARLOWSI.TTF', 'Augenstern');
imagecopy($img, $watermark, 400, 20, 0, 0, $watermarkwidth, $watermarkheight);
imagejpeg($img);
imagedestroy($img);
?>

运行结果有文字水印还有图片水印
Augenstern
效果不怎么样,将就着还能看。
部分参数说明:
imagecopy()

imagecopy(dst_im, src_im, dst_x, dst_y, src_x, src_y, src_w, src_h)

第一个参数是加水印的图片(方便区分,我叫它原图),
第二个参数是水印图片,
第三个参数是水印要加在原图的什么位置。左上角还是右上角来着我容易记混,干脆就不记了,直接看效果来判断向什么方向移动。
第四个参数和第五个参数是从水印图片什么位置开始拷贝。同样不记得位置,(办法总比困难多,我相信都会有自己的解决办法的。😁😁😁)
第六个参数和第七个参数是截取水印的宽度和高度。

这次学习就到这里。 坚持下去,加油。奥利给!🤣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章