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)

第一個參數是加水印的圖片(方便區分,我叫它原圖),
第二個參數是水印圖片,
第三個參數是水印要加在原圖的什麼位置。左上角還是右上角來着我容易記混,乾脆就不記了,直接看效果來判斷向什麼方向移動。
第四個參數和第五個參數是從水印圖片什麼位置開始拷貝。同樣不記得位置,(辦法總比困難多,我相信都會有自己的解決辦法的。😁😁😁)
第六個參數和第七個參數是截取水印的寬度和高度。

這次學習就到這裏。 堅持下去,加油。奧利給!🤣

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