第四章 字符串操作與正則表達(dá)式
1.mail()函數(shù)
- bool mail (string to, string subject, string message,string[additional_headers[, string additional_parameters]]);
- string to、string subject、string message這三個(gè)參數(shù)是必需的,分別代表發(fā)送郵件的目的地址、主題行和消息內(nèi)容。
- addational_headers 的第四個(gè)參數(shù)可以用來發(fā)送任何額外的、有效的郵件頭。
- addational_parameters的第五個(gè)參數(shù)可以向任何經(jīng)過配置用來發(fā)送電子郵件的程序傳遞參數(shù)。
2.字符串的格式化
-
整理字符串
- 整理字符串首先要清理字符串中多余的空格。為了將字符串存入文件或數(shù)據(jù)庫中,或者將其與別的字符串進(jìn)行比較,就是非常需要的一步。
-
trim()函數(shù)、ltrim()函數(shù)和rtrim()函數(shù)(rtrim別名又叫chop)
- 該函數(shù)可以除去字符串開始位置和結(jié)束位置的空格,并將結(jié)果字符串返回。
- 衍生函數(shù):ltrim()和rtrim()函數(shù),他們兩個(gè)的使用和trim()函數(shù)是一樣的,區(qū)別在于trim()是除去字符串開始和結(jié)束位置的空格;而ltrim()函數(shù)是去除開始(左邊)位置的空格;rtrim()是去除結(jié)束(右邊)為止的空格。
- 除去的字符:
- 默認(rèn)的情況下,除去的字符是換行符和回車符(\n 和 \r),水平和垂直制表符(\t 和\x0B)、字符串結(jié)束符(\0)和空格。
- 除此之外,還可以通過設(shè)置trim()函數(shù)的第二個(gè)參數(shù)來提供要過濾的特殊字符。
-
格式化字符串并顯示
-
nl2br()函數(shù)
該函數(shù)是使用HTML格式化,其將字符串作為輸入?yún)?shù),用XHTML中的<br />標(biāo)記代替字符串中的換行符。
該函數(shù)在字符串中的每個(gè)新行(\n)之前插入HTML換行符(
<br>
或<br \>
)因?yàn)?code><br />是html中的寫法,在PHP中無法用來劃分長字符串;如果想將一個(gè)長字符串顯示在瀏覽器中的話,使用nl2br會更有效。
舉例來說:
<p><?php echo nl2br($mailcontent);?></p>
和<p><?php echo "Customer name:".$name."<br />"."Customer email:".$email."<br />"."Customer coments:".$feedback."<br />";?></p>
實(shí)際效果大致相同。- echo nl2br($mailcontent);效果圖
- echo "Customer name:".$name效果圖
-
nl2br()函數(shù)
-
printf()函數(shù)
-void printf(string format [, mixed args...]);
- 該函數(shù)是將一個(gè)格式化的字符串輸出的瀏覽器中。
- 該函數(shù)的第一個(gè)參數(shù)都是字符串格式,它使用格式代碼而不是變量來描述輸出字符串的基本形狀。
- 其他參數(shù)是用來替換格式字符串的變量。
- 該函數(shù)的優(yōu)點(diǎn)在于,可以使用更有用的轉(zhuǎn)換說明來制定$total為一個(gè)浮點(diǎn)數(shù)。
- 例如:
printf("Total amount of order is %.2f", $total);
- 上述代碼打印出的$total中12.4將改為12.40。
- 例如:
-
echo "Total amount of order is $total.";
和printf("Total amount of order is %s.",$total);
的結(jié)果相同。- 格式化字符串的
%s
是轉(zhuǎn)換說明。 - 轉(zhuǎn)換格式
%['padding_character][-][ width][.precision]type
- 所有轉(zhuǎn)換格式都遵循同意的格式。
- 所有轉(zhuǎn)換說明都以%開始。如果想打印一個(gè)
%
符號,必須使用%%
。 - 參數(shù)padding_character是可選的,其將被用來填充變量直至所指定的寬度;其默認(rèn)的填充字符是一個(gè)空格,如果指定了一個(gè)空格或0,就不需要'作為前綴了。
- -也是可選的,它指明該域中的數(shù)據(jù)應(yīng)該左對齊,如果不添加,則默認(rèn)是右對齊。
- width參數(shù)告訴printf()函數(shù)在這里為將被替換的變量留下多少空間(按字符計(jì)算)。
- precision便是必須是以一個(gè)小數(shù)點(diǎn)開始。簡單來說就是表明小數(shù)點(diǎn)后面要保留(顯示)的位數(shù)。
- 轉(zhuǎn)換說明的類型碼
- %:文字百分比字符。不需要參數(shù)
- b:參數(shù)被視為整數(shù),并顯示為二進(jìn)制數(shù)
- c:整數(shù),并作為字符輸出(ASCII值的字符)
- d:整數(shù),并作為小數(shù)輸出
- f:雙精度數(shù),并作為浮點(diǎn)數(shù)輸出
- e:科學(xué)計(jì)數(shù)法(1.2e+2).
- o:整數(shù),并作為八進(jìn)制數(shù)輸出
- s:字符串,并作為字符串輸出
- u:整數(shù),并作為非指定小數(shù)輸出
- x:整數(shù),并作為帶有小寫字母a~f的十六進(jìn)制數(shù)輸出
- X:整數(shù),并作為帶有大寫字母A~F的十六進(jìn)制數(shù)輸出
- 格式化字符串的
- 使用帶序號的參數(shù)方式來調(diào)用參數(shù)。
-
printf("Total amount of order is %2\$.2f(with shipping %1\$.2f)",$total_shipping,$total);
- 上述代碼中,
%2\$.2f
代表著使用列表中的第二個(gè)參數(shù)替換。 - 在%符號后添加參數(shù)的位置,并且以$符號位結(jié)束,這樣就意味著參數(shù)的順序并不一定要與轉(zhuǎn)換說明中的順序相同。
- 上述代碼中,
-
- vprintf()函數(shù)和vsprintf()函數(shù)
- 上述兩個(gè)函數(shù)更多的是針對與數(shù)組,它們需要接受兩個(gè)參數(shù):格式字符串和參數(shù)數(shù)組,而不接收可變數(shù)量的參數(shù)。
-** 改變字符串大小寫**
- 上述兩個(gè)函數(shù)更多的是針對與數(shù)組,它們需要接受兩個(gè)參數(shù):格式字符串和參數(shù)數(shù)組,而不接收可變數(shù)量的參數(shù)。
- 可以重新格式化字符串中的字母大小寫。
- 相關(guān)函數(shù)和效果
以
$abc="total Amount of Order";
為例-
strtoupper()
- 將字符串轉(zhuǎn)換為大寫。
echo strtoupper($abc)
- strtoupper()
-
strtolower()
- 將字符串轉(zhuǎn)換成小寫
echo strtolower($abc);
- ucfirst()
- 如果字符串的第一個(gè)字符是字母,就大寫該字母。
- `echo ucfirst($abc);`
-
- ucwords()
- 將字符串每個(gè)單詞的第一個(gè)字母轉(zhuǎn)換為大寫
- `echo ucwords($abc);`
-
-
格式化字符串后存儲
- 目的是為了將重新格式化的字符串更便于存入數(shù)據(jù)庫。
- 之所以要這么做是因?yàn)閿?shù)據(jù)庫有時(shí)候會將某些字符解釋成控制符。比如"",'',\和NULL字符。
- 很多時(shí)候的做法是我們在這些字符前面加上轉(zhuǎn)義字符(也就是\),這樣""就變成了" ",' ',\。
- 轉(zhuǎn)義字符對所有特殊字符都通用,所以如果某個(gè)字符串中存在\\這樣的特殊字符,則轉(zhuǎn)義的顯示為\\。
- addslashes()函數(shù)
- 該函數(shù)是PHP中專門用于轉(zhuǎn)義的函數(shù)。
- 該函數(shù)和其他函數(shù)一樣,需要一個(gè)字符串作為輸入?yún)?shù);然后經(jīng)過處理之后,返回一個(gè)重新格式化后的字符串。
- 以
$feedback=addslashes(trim($_POST['feedback']));
為例 - 不加addslashes()函數(shù)前
- 加了addslashes()函數(shù)后
- 現(xiàn)在的PHP版本 對所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動(dòng)運(yùn)行 addslashes()。所以不需要對已經(jīng)轉(zhuǎn)義過的字符串使用addslashes()函數(shù),因?yàn)橐坏┦褂镁蜁?dǎo)致雙層轉(zhuǎn)義。
- stripslashes()函數(shù)
- 該函數(shù)可用于刪除有addslashes()函數(shù)添加的反斜杠。
- 也可用于清理從數(shù)據(jù)庫中或從THML表單中取回的數(shù)據(jù)中的數(shù)據(jù)
3.連接和分割字符串
-
explode()、implode()和join()
-
explode()函數(shù)
array explode( string separator, string input [, int limit]);
- 該函數(shù)帶有一個(gè)輸入字符串作為參數(shù),并根據(jù)一個(gè)指定的分隔符字符串將字符串本身分割為小塊,將分割后的小塊返回到一個(gè)數(shù)組中。
- limit參數(shù)是可選參數(shù),其可以用來限制分成字符串小塊的數(shù)量。
- 舉例:
-
$email=trim($_POST['email']);
$email_array=explode('@',$email);
print_r($email_array);
-
-
explode()函數(shù)
- *implode()和join()函數(shù)*
- 兩個(gè)函數(shù)的結(jié)果是一致得,他們所實(shí)現(xiàn)的效果與explode()正好相反。
- 舉例:
- `$emailArray=explode('@',$email);`
`$newArray=implode('*',$emailArray);`
`echo gettype($newArray)."->".$newArray;`
-
-
strtok()函數(shù)
string strtok(string input, string separator);
- 該函數(shù)可以一次只從字符串中取出一些片段(token),這與explode()函數(shù)的每次將一個(gè)字符串全部分割成若干小塊是不同的。
- 對于從字符串中取出單個(gè)單詞的處理來說,strtok()函數(shù)效果更好一些。
- 該函數(shù)的分隔符可以是一個(gè)字符,也可以是一個(gè)字符串;但需要注意的是,輸入的字符串會根據(jù)分隔符字符串中的每個(gè)字符來進(jìn)行分隔,而不是根據(jù)整個(gè)字符串來分隔。
- 如果為了獲得首個(gè)token,在調(diào)用該函數(shù)時(shí),需要輸入兩個(gè)參數(shù):一個(gè)是要進(jìn)行token化的字符串,還有進(jìn)分隔符;而在之后的調(diào)用中,則可以只用分隔符一個(gè)參數(shù)。
- 舉例:
$feedBack=addslashes(trim( $_POST['feedback']));
$token=strtok($feedBack," ");
echo $token."<br />";
while ($token!=" "){
$token=strtok(" "); //當(dāng)今性二次調(diào)用的時(shí)候就不用再次輸入調(diào)用的字符串了
echo $token."<br />";
}
-
substr()函數(shù)
string substr(string string., int start[, int length]);
- 該函數(shù)允許我們訪問一個(gè)字符串給定起點(diǎn)和終點(diǎn)的子字符串,換句話說就是返回substr()函數(shù)所選定的一部分字符串。
- string必選參數(shù)。指定所要返回那一部分字符串。
- start必選參數(shù)。指定字符串從指定的位置開始。
- 正數(shù):從字符串指定的位置開始
- 負(fù)數(shù):從字符串結(jié)尾開始的指定位置開始。
- 0:從字符串中的第一個(gè)字符處開始;字符串和數(shù)組一樣,起點(diǎn)都是從0開始的
- 如果只用正數(shù)作為子字符串起點(diǎn)來調(diào)用這個(gè)函數(shù),則得到的是從起點(diǎn)到字符串結(jié)束的整個(gè)字符串。
- 舉例:
$test= 'Your customer service is excellent'; echo substr($test,1);
- 舉例:
- 如果用負(fù)數(shù)作為子字符串起點(diǎn)來調(diào)用這個(gè)函數(shù),得到的則是從該字符串末端返回的長度。
- 舉例:
`$test= 'Your customer service is excellent';
echo substr($test,-17);`
-
- length參數(shù)。
- 可選,規(guī)定被返回字符串的長度。
- 默認(rèn)是到字符串結(jié)尾。
- 正數(shù):從start參數(shù)所在的位置往后所返回的length長度。
- 負(fù)數(shù):從字符串末端返回的長度
- 舉例:
- `$test= 'Your customer service is excellent';
echo substr($test,1,13);`
-
- `$test= 'Your customer service is excellent';
echo substr($test,1,-1);`
-
4.比較字符串
-
==
- 最簡單的方法:使用"=="來比較兩個(gè)字符串是否相等。
-
strcmp()、strasecmp()和strnatcmp()
-
strcmp()
int strcmp(string str1,string str2)
- 如果str1==str2,則該函數(shù)返回0;
-
$str1="abc";
$str2="abc";
echo strcmp($str1,$str2);
-
-
strcmp()
- 如果str1>str2,則該函數(shù)返回一個(gè)整數(shù)。
-
$str1="abc";
$str2="ABC";
echo strcmp($str1,$str2);
-
- 如果str1<str2,則該函數(shù)返回一個(gè)負(fù)數(shù)。
-
$str1="ABC";
$str2="abc";
echo strcmp($str1,$str2);
-
- 該函數(shù)區(qū)分大小寫
- a>z>A>Z
- strcasecmp()函數(shù)
- 除了不區(qū)分大小寫之外,其他和strcmp()函數(shù)一樣。
-
$str1="ABC";
$str2="abc";
echo strcasecmp($str1,$str2);
-
- strnatcmp()函數(shù)
- 除了不區(qū)分大小寫之外,該函數(shù)還會按照自然排序比較字符串。
- 自然排序是指按人們習(xí)慣的順序進(jìn)行排序。
- 比如在字典排序上來看2>12,因?yàn)?在12前面。
- 而自然排序來說12>2。
- `$str1="2";`
$str2="12";
echo strcasecmp($str1,$str2)."<br />";
echo strnatcmp($str1,$str2);
-
- strlen()函數(shù)
- 該函數(shù)用來檢查字符串的長度。
echo strlen("Hello World");
- 該函數(shù)計(jì)算空格
5.匹配和替換字符串
-
strstr()、strchr()、strrchr()和stristr()函數(shù)
- 上述函數(shù)都是在一個(gè)字符串中查找另一個(gè)字符串
-
strstr()函數(shù)
string strstr(string haystack, string needle);
- 該函數(shù)可以用于在一個(gè)較長的字符串中查找匹配的字符串或字符。
- strchr()和strstr()完全一樣,這兩個(gè)函數(shù)都可以在字符串中查找一個(gè)字符串,包括只包含一個(gè)字符的字符串。
- 想要使用該函數(shù)必須向該函數(shù)傳遞一個(gè)要被搜索的子字符串參數(shù)和一個(gè)目標(biāo)關(guān)鍵字字符串參數(shù)。
- 如果只找到了該關(guān)鍵字的一個(gè)精確匹配,則會從目標(biāo)關(guān)鍵字前面返回被搜索的字符串,否則返回值為false。
- 如果存在不止一個(gè)關(guān)鍵字,則返回的字符串從出現(xiàn)的第一個(gè)目標(biāo)關(guān)鍵字的位置開始。
- 舉例:
-
$toaddress="feedback@example.back.com";
echo strstr($toaddress,"exa");
- `$toaddress="feedback@example.back.com";`
echo strstr($toaddress,"exa");
-
- *stristr()函數(shù)*
- 該函數(shù)是strstr()的變體,主要區(qū)別在于不區(qū)分字符的大小寫。
- *strrchr()函數(shù)*
- 該函數(shù)作用和strstr()一樣,區(qū)別在于會從最后出現(xiàn)目標(biāo)關(guān)鍵字的位置的前面返回被搜索字符串;簡單來說就是從后往前搜索。
- 該搜索在實(shí)際使用中與strstr()函數(shù)還有一點(diǎn)不同在于,該搜索從后向前搜索時(shí),遇到第一個(gè)精確匹配的關(guān)鍵字之后就返回結(jié)果了,不再向前繼續(xù)搜索。
- `$toaddress="feedback@example.back.com";`
echo strrchr($toaddress,"back");
-
-
strpos()、strrpos()函數(shù)
- 這兩個(gè)函數(shù)都是返回目標(biāo)關(guān)鍵字子字符串在北搜索字符串中的位置。
- 現(xiàn)在PHP建議在查找某個(gè)子字符串在字符串中出現(xiàn)的位置時(shí)候,推薦使用strpos()函數(shù)來代替strstr()函數(shù),因?yàn)榍罢卟檎宜俣雀臁?/li>
-
strpos()函數(shù)
int strpoe(string haystack, string needle, int[offset]);
- 該函數(shù)區(qū)分大小寫。
- 舉例:
-
$test="hello world";
echo strpos($test,"r");
-
- "r"在字符串$test中位于第8個(gè)(從0開始)
- 該函數(shù)offset參數(shù)可以用來指定被搜索字符串的開始搜索位置。
- 舉例:
-
$test="I still haven't received delivery of my last order.";
echo strpos($test,"s",5);
- 讀作42,實(shí)際是43
- 該函數(shù)是從$test字符串第5個(gè)開始對"s"進(jìn)行搜索,所以看不到第2個(gè)位置的"s"(記住字符串也是從0開始計(jì)數(shù)),下一個(gè)"s"出現(xiàn)在第42(實(shí)際43)個(gè)位置
-
strrpos()函數(shù)
- 該函數(shù)返回的是被搜索字符串中最后一次出現(xiàn)目標(biāo)關(guān)鍵字的子字符串的位置;簡單來說就是從后往前搜索到精確匹配子字符串的位置。
- 舉例:
-
$test="I still haven't received delivery of my last order.";
echo strpos($test,"s")."<br />";
echo strrpos($test,"s");
-
- 同樣是搜索"s",strpos()搜索到的是正數(shù)第2個(gè),strrpos()搜索到的則是正數(shù)第42個(gè)。
- 存在的問題:
- 因?yàn)闊o論在什么情況下,strpos()和strrpos()函數(shù)如果查不到目標(biāo)關(guān)鍵字,則其會返回false。而對于PHP來說false等于0,而0又代表著所查找字符串的第一個(gè)字符,這將可能使得今后對字符串的操作造成問題。為了避免此問題的出現(xiàn),我們是時(shí)候用上"==="了。
- `$test="I still haven't received delivery of my last order.";`
$result=strpos($test,"x");
if($result===false){
echo "Not found";
}else{
echo "Found at position".$result;
}
echo "<br />".gettype(strpos($test,"x"));
echo "<br />".gettype(strrpos($test,"s"));
-
-
替換字符串
- 該操作也可以用字符串函數(shù)或者正則表達(dá)式函數(shù)來實(shí)現(xiàn)。
- str_replace()函數(shù)
mixed str_replace(mixed needle,mixed new_needle, mixed haystack[, int & count]);
- 個(gè)人理解:
- needle:查找的值;
- new_needle:替換查找到的值(替換needle);
- haystack:包含查找值()needle)的被搜索字符串;
- count:統(tǒng)計(jì)替換的次數(shù)。
- 該函數(shù)用new_needle替換所有的haysatck中的needle,并且返回haystack替換后的記過。
- count是可選的,它包含了要執(zhí)行的替換操作次數(shù)。
- 舉例:
-
$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "替換數(shù):$i";
-$i計(jì)算替換的次數(shù)
-
- 舉例:
- 該函數(shù)區(qū)分大小寫;如若不想?yún)^(qū)分則應(yīng)該使用str_ireplace()函數(shù)。
- 該函數(shù)必須遵守的規(guī)則:
- 如果搜索的字符串()是數(shù)組,那么它也將返回?cái)?shù)組;
- 如果搜索的字符串是數(shù)組,那么它將對數(shù)組中的每個(gè)元素進(jìn)行查找和替換;
- 如果同時(shí)需要對數(shù)組進(jìn)行查找和替換,并且需要執(zhí)行替換的元素少于查找到的元素的數(shù)量,那么多余元素將用空字符串進(jìn)行替換;
- 舉例:
-
$find = array("Hello","world");
$replace = array("B");
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr));
- world被替換成了空字符
-
- 舉例:
- 如果查找的是數(shù)組,而替換的是字符串,那么替代字符串將對所有查找到的值起作用。
- 該函數(shù)可以用來替換敏感詞。
-
substr_replace()函數(shù)
string substr_replace(string string, string replacement, int start, int [length]);
- 個(gè)人理解:
- string:需要檢查的字符串
- replacement:需要替換的字符串
- start:在字符串的何處開始替換,所謂的偏移量
- length:要替換多少個(gè)字符
- 該函數(shù)是把字符串的一部分替換成另外一個(gè)字符串。
- start參數(shù)
-
正數(shù):在字符串中的指定位置開始替換;
echo substr_replace("Hello world","Shanghai",7);
- 從第7個(gè)字符開始替換
-
負(fù)數(shù):從字符串末尾的指定位置開始替換
echo substr_replace("Hello world","Shanghai",-3);
- 從倒數(shù)第3個(gè)字符開始替換
-
0:從字符串第一個(gè)位置開始替換
echo substr_replace("Hello world","Beijing",0);
- 從0開始的字符串
- 0的特點(diǎn)在于如果replace的字符串?dāng)?shù)量小于string的話,則string多出來的也不會顯示。
-
- length參數(shù)(可選)
- 正數(shù):被替換的字符串長度;
echo substr_replace("Hello world","Beijing",0,2);
- 被替換的字符串長度為2
- 負(fù)數(shù):等待替換的子字符串結(jié)尾處距離string末端的字符個(gè)數(shù);
echo substr_replace("Hello world","Beijing",0,-2);
- 距離末端2個(gè)字符個(gè)數(shù)
- 0:插入而非替換
echo substr_replace("Hello world","Beijing",0,0);
- 插入而非替換
- 正數(shù):被替換的字符串長度;
-
正則表達(dá)式
- 字符串函數(shù)的使用只限于進(jìn)行精確匹配或精確的字符串匹配;而如果希望完成一些更復(fù)雜的模式匹配,則應(yīng)該嘗試使用正則表達(dá)式。
- 正則表達(dá)是是一種描述一段文本模式的方法;精確匹配其實(shí)也是一種正則表達(dá)式,比如搜索字符串“l(fā)ove”,其實(shí)就是一個(gè)正則表達(dá)式。
- 使用正則表達(dá)式,可以更具體地指明希望匹配的字符類型,并且可以指明字符所屬的一個(gè)集合。
- 比如想要尋找以og結(jié)尾的字符串,就可以用
.at
來表示;- 但這樣的用法有一個(gè)缺陷在于所查找出來的at結(jié)尾的字符串可能會包含特殊字符,如:
#og,&og
等。 - 如果想要把其限定在英文字母內(nèi),則應(yīng)該寫作
[a-z]og
或者[A-Z]og
亦或者[a-zA-Z]og
,這樣就可以更精確的找出例如dog的、Tog等字符串。
- 但這樣的用法有一個(gè)缺陷在于所查找出來的at結(jié)尾的字符串可能會包含特殊字符,如:
- 比如想要尋找以og結(jié)尾的字符串,就可以用
-
關(guān)于脫字符(^)
- 如果脫字符()被包括在方括號里面,如[a-z],則表示否;
- 如果放在方括號外則會有兩種情況:
1.放在正則表達(dá)式前,如:^[a-zA-Z0-9_-]這種情況,則表示正則表達(dá)式的開始;在實(shí)際運(yùn)行時(shí)則會根據(jù)后方的正則表達(dá)式來匹配應(yīng)內(nèi)容。
2.而如果僅僅是單獨(dú)使用,則會被解釋為一般的特殊字符;同樣的如果想要在正則表達(dá)式中使用^作為一般特殊字符,則需要在其前面加上轉(zhuǎn)義字符(\),如\^
。
正則表達(dá)式入門:http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html