本文目錄
函數
可變函數
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');
?>
加上運行結果,回頭複習更加容易理解。
內部(內置)函數
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));
?>
運行結果是
通過代碼,可以直觀的看出來定界符的用法
普通字符
正則表達式裏的普通字符。如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 />";
?>
元字符另外還有好多,
+
匹配一次或者多次前面的字符。
?
匹配一次或者零次前面的字符。
{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 />";
?>
.*
配合,默認情況儘可能多的匹配字符。(貪婪匹配)。
上面代碼運行結果是
.*?
配合,解決貪婪問題,
<?php
$pattern = '/t.*?t/';
$str ='ancasdst3fgfgfstfdddfjdkodt';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
echo " <br />";
?>
之前看過一個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);
?>
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 "沒找到!";
}
?>
運行結果
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();
?>
運行結果:
圖像處理
創建一個簡單圖像
創建圖像
$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');//向瀏覽器說明這是個圖片
這樣就能在瀏覽器中看到效果圖了
驗證碼
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模式,個別函數用時查手冊。
運行結果:
水印
打開服務器或網絡文件中已經存在的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);
?>
效果如下:
水印大小、位置均可調,還可以設定它佔圖片寬和高的比例。
圖片水印
找好當水印的圖片,與要加水印的圖片放在同一路徑下。
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);
?>
運行結果有文字水印還有圖片水印
效果不怎麼樣,將就着還能看。
部分參數說明:
imagecopy()
imagecopy(dst_im, src_im, dst_x, dst_y, src_x, src_y, src_w, src_h)
第一個參數是加水印的圖片(方便區分,我叫它原圖),
第二個參數是水印圖片,
第三個參數是水印要加在原圖的什麼位置。左上角還是右上角來着我容易記混,乾脆就不記了,直接看效果來判斷向什麼方向移動。
第四個參數和第五個參數是從水印圖片什麼位置開始拷貝。同樣不記得位置,(辦法總比困難多,我相信都會有自己的解決辦法的。😁😁😁)
第六個參數和第七個參數是截取水印的寬度和高度。
這次學習就到這裏。 堅持下去,加油。奧利給!🤣