字符串處理函數-1
字符串處理函數-2
字符串處理函數-3
8.3.3 字符串處理函數
8.3.3.1 字符串處理函數概述
在web編程中,字符串是使用最爲遠筆頻繁的數據類型之一。因爲PHP不是一門強固類型化語言,因此很多數據都(d我公ōu)可以方便的作爲字符串來處理。字符串操作是編程中極爲常用的操作,討都從簡單的打印輸出一行字符串到複雜的正則表達式等,處理目标都草南(dōu)是字符串。PHP提供了大量實用的函數,可以幫助用戶完成兵又(chéng)許多複雜的字符串處理工作。PHP提供的字符串處理函木秒數及其功能(néng)如表8-2所示。
&nb下票sp; 好下 &nb外金sp; &nb書道sp;
&n草司bsp; 表8-2列出了常用的PHP字符串操作函數土船。
8.3.3.2 trim()道跳、ltrim()、rtrim()、chop(山房)和strlen()函數  熱服; &nb生草sp; &n科事bsp; &近黑nbsp; 業煙 間新  紅姐; &nbs年習p;
這(zhè)5個函數中前4個函數的功能(néng)類似,因此亮爸將(jiāng)其放在一起(qǐ)介紹。chop()函數朋票與rtrim()函數作用相同,都(dōu)是去除字符串右端的空格。lt計話rim()用來去除字符串左端的空格,而trim()用來去很媽除字符串左右兩(liǎng)端的空格。
下面(miàn)來看一個例子,其中用到了另外一個字和拿符串處理函數strlen()來獲得字符串的長(cháng)就小度。
1: <!--文件8-6.php:去除字符串兩(liǎng)端空格-->
2: &nbs雨村p; <HTML>
3: <H離還EAD>
4: &nbs內長p;  工房; <TITL高老E>去除字符串兩(liǎng)端空格</TITLE>
5: &紙習lt;/HEAD>
6: 農老 <BODY>
7: &n我錯bsp; &nb房說sp;  了歌; <?php
8: &n不哥bsp; &nb書資sp; $str=&qu可西ot; 你看不到我 我是空格 ";
9:  區木; &nbs亮弟p; echo &行拿quot;方括号中爲原始字符串:[".$str."]<br>&q要輛uot;;
10: &n農快bsp; &nbs作從p;  做水; echo "話小;原始字符串長(cháng)度:".strlen($str).個物"<br>"美土;
11: &n筆姐bsp; &nbs放拿p; &報區nbsp; $str1=ltrim($str);
12: &nbs能黑p; &n關相bsp; &nbs喝高p; echo "執行ltrim()之後(hòu)的長(cháng)度:".strlen($str1)."<br>間近;";
13: 相業 看通 光男 $str2=rtrim($str);
14: 些請 資大 &秒黑nbsp; echo "執行rtrim()之後(hòu)的長(cháng)度:".strlen($str2)."&亮黑lt;br>";
15: &n要好bsp; 志信 作公$str3=trim($str);
16: &理些nbsp; 關通 &nb唱林sp; echo "執行trim()之後(hòu)的長(cháng)度".strlen($s是車tr3)."<b美風r>";
17: &n對得bsp;  兒可; echo "去掉首尾空格之後(hòu)的字符串:[".$str3."]";
18: 自什 &nb開開sp; ?>
19: 作哥</BODY>
20: </HTML>
程序的運行結果如圖8-6所示。
圖8-6 程序8-6.php運行結果
在程序8-6.php中,首先構造了一個字符串$str,這(zhè)個字符串由地話9個漢字和4個空格組成(chéng),4個空格中有2雨銀個在左側,1個在中間,1個在右側(由于浏覽器會(huì)忽略掉連續的空格,相厭因此在浏覽器中連續的兩(liǎng)個空格的顯示效果與一個空格相湖計同)。由于每個漢字占2個字節,每個英文半好厭角空格占1個字節,因此初始字符串的長(cháng)度爲9月我*2 4=22。用strlen()函數來輸出其長(chá事西ng)度。
首先執行ltrim()函數,將(jiāng)返回結果存放在$str1中。由于ltrim()函數會(huì)去掉字符串左側的所有連續的空格,因此兩(li鐵坐ǎng)個空格就(jiù)被(bèi)去掉,$str2的字符串長(cháng)度爲20。
然後(hòu)執行rtrim()函數,將(jiāng)返回結果存放在$str2中。rtrim()函數去掉了字符串$str的右側一個空格,因此$str2的長(cháng)度爲21。
最後(hòu)執行trim()函數。trim()函數去除字符串左右兩(liǎn年哥g)側的所有空格,因此左側的2個空格和右側的1個空格被(bèi)去掉,剩餘的部也了分長(cháng)度爲19。通過(guò)$str3的輸出也可以看出,字符串兩(liǎng)側的空格已經(jīng)消失。
去除連續的空格往往用在做字符串比較之前。要比較兩(liǎng)個字符串是請木否相同時(shí),如果其中一個字符串首尾帶有空舊金格,那比較結果就(jiù)會(huì)爲這志假。如"abc"和"abc"這(zhè)兩(liǎng)個字符串,看似内容完全相同,但由于後(h雨北òu)者多面(miàn)多了一個姐時空格,在比較時(shí)會(huì)返回false。因此比較兩(liǎng)個字符串南好變量的值是否相同時(shí),往往首先用trim函數處理一下兩(liǎng)側的空格。
值得注意的是,trim系列函數隻去除字符串兩(liǎng)側的微子空格,而不會(huì)去除中間的空器人格。如例8-6.php中,“你看不到我”和“我是空格”之間有一個空格。調用這(zhè)3個函數之後(hòu)空格仍然存在,說(shuō)明字符串中間的空格不會個如(huì)受影響。如果确實想去除掉一個字符串中的所有空格,可以使用媽公後(hòu)面(miàn)要講的字符串替換函數來實現。
8.3.3.3 ucwords(知空)、ucfirst()、strtoupper()、strtolower()、str_word_count()函數
這(zhè)5個函數對(duì)字符串中的單詞進(jìn)行處理,包紙開括轉換大小寫轉換、計算單詞個數等。還(hái)是得多通過(guò)一個例子來了解它們的用車路法。
1: <!--文件8-7.php:字符串中的單詞處理-->
2: &妹城nbsp; <熱舞;HTML>
3: 時匠 &nb上小sp; <HEAD>
4: &綠船nbsp; &nb有聽sp; <TITLE>字符串處理中的單詞處理</TITLE>
5:  工件; &nbs北答p; </HEAD&山愛gt;
6:  農他; &l木商t;BODY>
7: &樂為nbsp; &nb可朋sp; <?php
8: 理些 &nb人短sp; $str="車為;ni hao, wo jiao Wang Xiao-min公校g.";
9: &nbs們綠p; &玩土nbsp; 討門 echo "原始字符串:".$str."<br&林大gt;";
10: 好線 &nbs數畫p; &nbs如湖p; $st白煙r1=ucfirst($str);廠小
11:  妹她; 志南 &nbs嗎票p; echo "執行ucfirst()之後(hòu):".$str1."<br>";
12:  站東; &人機nbsp; $str2=ucwords($str);
13: &nb習店sp; &中用nbsp; 冷鐵 echo "拿書;執行ucwords()之後(hòu):".$str2."<br>";
14: &nb歌鄉sp;  關線; $著計str3=strtoupper($str);
15: &章銀nbsp; &nb機玩sp; echo司討 "執行strtoupper()之後(hòu):".$str3."&草煙lt;br>";
16: &n算用bsp; &nbs西場p; $str4=strtolower(長看$str);
17: &開自nbsp; &爸是nbsp; &知秒nbsp; echo "執行strtolower()之後(hòu):".$str4."<br>&金熱quot;;
18: &東熱nbsp; &nbs文可p; echo "字符串中一共有:".str_word_count($str)."裡理;個單詞。";
19: &nbs章歌p; &nbs機鐵p; ?>
20: </BOD街關Y>
21: </HTML>
程序的運行結果如圖8-7所示。
圖8-7 程序8-7.php的運行結果
程序8-7.php中,構造了一個包含有6相男個單詞、大小寫混合的字符串,并用作自它來測試函數的運行結果。程序調用ucfi我公rst()函數將(jiāng)木商整個字符串首字母變爲大寫,調用ucwords()函數將(jiāng)每個單詞的很和首字母變爲大寫,調用strtoupper()舞不函數將(jiāng)全部字母都(dō科會u)變成(chéng)大寫,調用strt近飛olower()函數將(jiāng)所有字母變成(chéng)小寫,最看間後(hòu)調用str_word_count()函數統計字符木遠串中的單詞個數。
8.3.3.4 字符串查找函數
程序中經(jīng)常用到在一個字符串中查找某個字符或者某個子串的操作;體是對(duì)字符串中的某些字符按照用戶的需求進(jìn)行替換外兒操作以及截取字符串的一部分等。PHP都(dōu)地很已經(jīng)準備好(hǎo)了一系列函數實現這(zhè)些著做操作,用戶隻需要了解函數的使用方法,即可輕松實現。
常用的字符串查找函數有substr_count()、strpos()、strrpos()、strstr()、strrchr()等。它們的使用方法和功能(néng)如下商書。
1.substr_count()函數
substr_count()函數的格式爲:
int substr_count ( string haystack的爸, string needle [, int offset [, int 通懂length]] )
substr_count()函數用來統計一個字符串needle在另一個字符串haystack中出現的次數。該函數返回值是一個整數。有兩(liǎng)個可在風選參數:offset和length,分别表示要查找的起(qǐ)點和長(ch了廠áng)度。值得注意的是,offset是從0開(kāi)始計算,而不是從1開(kāi)始計算的。
1: <!--文件8-7.php:用substr_count函數統計字符串出現次數-->
2: <HTML>
3: &nb志多sp; <HEAD>
4: &nbs計靜p; &n呢購bsp; <TITLE>用substr_count函數統計字符串出現次數</TITLE>
5: 術低</HEAD>
6: &nb師個sp; <BODY>
7: 快化 城我 <?php
8: &nb問地sp; &n明從bsp; &nbs書筆p; $str=&匠雨quot;I am an abstract about ab們匠road.";
9:  時笑; 學件 &nb是樂sp; echo su知大bstr_count($str,"但亮;ab");
10: 物火 &nb場藍sp; &n店明bsp; echo ",";
11: &nb外要sp;  微我; echo subs國喝tr_count($str,&q在熱uot;ab",6,4);
12: &坐唱nbsp; ?>
13: &遠章nbsp; </BODY>
14: </HTML>
本例的輸出結果爲“3,1”。
substr_count($str,"ab")的作用是返回字符串"ab"在字符串$str中的次數,由于"ab"在整個字符串中出現了三次,因此值爲3。
substr_count($str,"ab&qu近坐ot;,6,4)的作用是返回字符串"ab"在$str中的從第6個字符開(kāi)始(包含第6個字符,而且從0開(kāi)始計算),往後(hòu)數答對4個字符爲止(即第9個字符)之間的字符串中出現的次數。這(zhè)個描述看起(qǐ)來金科非常拗口和難懂。不妨換一種(zhǒng)描述方法:參數“6,4”限定了查找字符串的範圍。不指定參數時(shí),大街substr_count函數從整個字符串$str中查找"ab"的出現次數,而指定了參數之後(hòu),substr_count函數從指定的範圍内查找"ab"的出現次數。這(zhè)個範圍就(jiù)是從字符串的第6個字符開(kāi)始到第9個字符爲止的4個字符。具體到本例中,就(jiù)是"n ab"(注意n和a之間的一個空格也算一個字符)。顯然,在這(zhè)個範圍内,呢電"ab"隻出現了一次,因此返回1。
2.strrpos()函數和strpos()函數
strrpos()函數的格式爲:
int strrpos ( string haystack, mixed 動計needle [, int offset] )
該函數返回字符needle在字符串haystack中最後(hòu)一次出現的位置。這(zhè)裡(lǐ)needle隻能(néng)是一個字符,而不能和動(néng)是一個字符串。如果提供一個字在在符串,PHP也隻會(huì)取字符串的第一個字符,其他字符無效。參數offset也是用來限制查找的範圍。
strrpos()函數的格式爲:
int strpos ( string hays舊錯tack, mixed needle [, 讀拍int offset] )
該函數與strrpos函數僅一字之差,但功能(néng)相差很大。strpos()函數中的needle參數允許使用一個字符串,而且返回的是這(zhè)個字符串在haystack中第一次出現的位置,而不是最後(hòu)一次出現的路話位置。
1: <!-行放-文件8-9.php:字符串查找函數的使用(一)-->
2: <HTML>
3: &l火遠t;HEAD>
4: &n道錯bsp; 在秒 &nb拿學sp; <TITLE>字符串查找函數的使用(一)</TITLE>
5: </H現新EAD>
6: &nb個機sp; <BODY>
7: &nb快森sp; &l白城t;?php
8: &照吧nbsp; &nb風視sp; &秒南nbsp; 做子 $str="I am an abstr姐票act about abroad.&坐畫quot;;
9:  商化;  冷他; &n和綠bsp; echo "原始字符串爲:".$str."&l美在t;br>";
10: &nb歌些sp; &nbs呢站p; e火房cho "ab在字符串中的第一次出現位置爲:".strpos($答但str,"ab")."商業<br>";
11: &nb水技sp; &nbs船木p; &nbs明鄉p; echo "ab在字符串中的最後(hòu)一次出現位置爲:".strrpos($str,"ab").&q裡門uot;<br>";
12:  術物; &n北機bsp; &nbs輛呢p;echo "abcd在字符串中第一次出現的位置爲:".strpos($str,"abcd&q短外uot;);
13: &n制又bsp; 有歌?>
14: </年去BODY>
15: </HTML>
本程序的運行結果如圖8-8所示。
圖8-8 程序8-9.php的運行結果
程序8-9.php中首先構造了一個包含多個"ab"的字筆章符串。然後(hòu)分别調用strpos和s她銀trrpos函數來獲得"ab"子串在字符串中第一次和最後商鄉(hòu)一次出現的位置。輸出結果爲8和23。這(zhè)裡(lǐ)電生有兩(liǎng)點值得注意:第一點是這(zhè)裡(l司的ǐ)的8和23都(dōu)是指從0開(kāi)始計算的,而且是從子串的第一能花個字母出現的位置開(kāi)始計算。如子串爲"煙快ab",找到"ab&q明林uot;之後(hòu),以“a”的位置煙醫序号作爲函數的返回值,而不是“b”的位置序号。第二點是如果要查找的字符串花動不存在,則返回布爾值false。由于false無法山算直接輸出,因此最後(hòu)查找“abc信看d”子串時(shí)沒(méi)有任何輸出。
3.strstr()函數和strrchr()函數
strstr()函數和strrchr()兩(liǎng)個函數林銀的格式分别是:
string strstr ( s還從tring haystack, string needle )
string strrchr ( string haystac會師k, string needle )
由此可見,這(zhè)兩(liǎng)個函數均返回一秒影個字符串,而不是返回一個表示位置的整爸月數。兩(liǎng)個函數函數名不同,使用方法完全相同,但是其市視作用略有不同。strstr()函數用來查找一個子串needle在字符串haystack中第一次出現的位置,并返回從此位置開(kāi)始的字符串。strrchr()函數查找一個字符needle在字符串haystack中最後(hòu)一次出現的位置并返回從此位置開(kāi)始之後(hòu做站)的字符串。
1: <!-雜高-文件8-10.php:字符串查找函數的使用(二)-->
2: <HTML>
3: &nbs視暗p;<HEAD>
4: &nbs人水p; &nb長報sp; <TITLE>字符串查找函數的使用(二)</TITLE>
5: &nb章些sp; <靜民/HEAD>
6: &不做nbsp; <BODY>
7: 樂公  亮可; <內子;?php
8: &n妹樂bsp; &拿村nbsp; &nbs電著p; &nb風來sp; $str="千山鳥飛絕,萬徑人蹤滅,孤舟蓑笠翁,獨釣寒江雪。";
9: &n時秒bsp; &nbs劇紙p; &購哥nbsp; echo "1.原始字符串爲:".$str."<場熱br>";
10: &nb們微sp; &n亮綠bsp; &在也nbsp; echo "用strstr函數搜索“,”的返回結果:".strstr($str,&舞白quot;,達式").
"<br>";
11: &n媽海bsp; 要還 echo "這女用strstr函數搜索“孤舟”的返回結果:".strstr($str,"孤舟").
"<br>";藍可
12: &視花nbsp;  女雨; &器用nbsp; $str2=暗低"I have a great dream.";子哥
13: &船上nbsp; &nbs北白p; 務哥echo "2.原始字符串爲:".$str2."&大愛lt;br>";
14: &nbs雪哥p; 區如  月討; &n書子bsp; echo "用strrchr函數搜索"e"的返回結果:".strrchr($str2,"e新事").
"<br>";
15: &n劇刀bsp; &從妹nbsp; &n到風bsp; echo "試圖用strrchr函數搜索"at"的返回結果:".strrchr($str2,"at")月年;
16: 靜東 ?>
17: &看下nbsp; </BODY>
18: </HTML>
程序的運行結果如圖8-9所示。
圖8-9 程序8-10.php的運行結果
通過(guò)深入分析本例的輸出結果,就(jiù)能(n熱看éng)夠準确地把握strstr和strrchr函數的功了錢能(néng)特點。
首先,在第一個字符串中;用strstr函數搜索逗号“,”。該函數返回字符串中第一次出現上也“,”的位置之後(hòu)的字符串。由于第一次出現逗明到号是在"千山鳥飛絕"的“絕”字之後(hòu),因此,函數的返回去女結果就(jiù)是",萬徑人蹤滅……"(注意逗号本身也會(huì)被(bèi)返回)。爲了證明書志strstr函數可以使用一個字符串而不僅僅單個字符作爲參數,又在字符串中搜索“孤舟”,顯然站有應當返回"孤舟蓑笠翁……"。和程序的運行結果相同。
然後(hòu),又構造了一個英文字母構成(ché線章ng)的字符串"I have a great dream."務對;。用strrchr函數在字符串中查找“e”,返回字符串中最後(hòu)一次出現答外“e”的位置之後(hòu)的内容,程序也場中3次出現“e”,但最後(hòu)一次出現是在“dream”中,于是函數返回"eam."(e本身也被(bèi)返回)。最後(hòu)下站測試是否可以把一個字符串作爲參數傳遞給strrchr函數,在字符串中查找字符串“at”。如果該函數支持字符串參數,按照上面(miàn還中)的分析,應當返回"at dream."玩器;。但是根據圖8-9的運行結果可知,返回的卻是“am.”。爲什麼(me)呢?因爲strrchr函數不支持字符串參數。如果提供了字符串妹到參數,會(huì)自動截取字符串的第一個字符作爲參數。也就(jiù)是說(sh熱睡uō)參數“at”和參數“a”所起(qǐ)的作用一樣(yàng)。于是函數返回字符串謝拍中最後(hòu)一次出現“a”之後(hòu)的内容。也就(jiù)是“am.”。
可能(néng)有讀者會(huì)問,爲都師什麼(me)要構造一個英文的字符串來講解strrchr函數呢?通過(guò)剛才的分析就到會(jiù)已經(jīng)能(néng)夠得到答案。拍我因爲每一個漢字都(dōu)占兩(liǎng)個字節,在函數中兩(樹民liǎng)個字節會(huì)被(bèi)認爲是多個字符(英文中一個字符占一個月資字節)。因此,strrchr函數就(jiù)無法支持中文。也就(jiù)是說(shuō)不能(néng)的湖把一個或多個中文字符作爲參數傳遞給strrchr函數。
除了strrchr函數之外,PHP中還(hái)有很多函數無法直接處理中文,這(zhè)裡電少(lǐ)不一一列出,讀者在學(xué)習PHP和編寫程序時(shí)應當多加注意。
8.3.3.5 字符串替換函數
字符串替換是Web編程當中極爲常用的操作,如要過(guò)濾掉用戶提遠花交的不文明的詞語,或者處理掉字符串中包含的危險腳本,替換掉某些關鍵詞等。行身PHP提供了一些函數來完成(chéng)字符串替換操作那作,如nl2br()、str_replac時店e()等。
1.nl2br()函數
該函數的名字看起(qǐ)來比較怪,中間包含一可房個數字“2”,用漢語念起(qǐ)來似乎有點别扭。實際上這(zhè)裡(lǐ)的“2”在英文中念“two”,與“to”諧音。這(zhè)裡(lǐ)的“2”實際上就(jiù)是“to”的一種(zhǒng)縮寫。明白了這(通森zhè)一點之後(hòu),函數名字和功能(néng)就(jiù)一目雪動了然了。在很多中文參考資料中,將(jiāng)此什作函數的功能(néng)描述爲“將(jiāng)換行符替換成(ch他費éng)HTML的換行符<br>”,本書也沿用這(zhè)一解釋。但化長是如果查閱英文版PHP手冊,會(huì)發(fā)現木吧大意爲“在每一行前插入HTML換行标記<br>”。也就(jiù)是說(shuō)是“插入”而不是“替土可換”。但是我們在使用此函數時(s內很hí),就(jiù)其效果而言相當于“替換”,因此我們仍然采用煙線一貫的解釋,將(jiāng)其歸爲字符串替換函數。
我們通過(guò)一個簡單例子來說(shuō)明此函數的作街道用。
1: <!--文件8-11.php:nl2br()函數的使用-->
2: <HTML又學>
3: &高學lt;HEAD>
4:  可數; <TITLE&g風店t;nl2br()函數的使用</TITLE>
5: &nb湖坐sp; </HEAD&g輛劇t;
6:  這快; <BODY>體那
7:  森黑; 區行 <form action="8-1相家1.php" method="post">明什;
8:  我光; &nbs什在p; &nb文花sp; 請輸入一段包含回車的文字:<br>
9: &n能鐘bsp; &nbs和笑p; <textarea腦從 cols="30" rows=船訊"6" name="頻麗;content"></textarea鐘件>
10: 刀光 &nb到金sp; <input type=submit v物議alue="提交看效果">
11:  秒輛; </form>
12:  熱喝; <?php
13: 綠到 朋司 $content=$_POST["content化吃"];
14:  習著; &湖報nbsp; //如果用戶輸入内容不爲空
15: &nb分關sp; 對跳 if($content!="做我"){
16: 林電 &n鐵紅bsp; 廠坐 e跳離cho "<hr為討>";
17: &nbs作山p; &n高冷bsp; &不土nbsp; echo "直接輸出接收到的内容:<br>";
18: &nb來些sp;  站草; 身金 echo $co城水ntent;
19:  北地; &輛國nbsp; &nbs件下p; echo &quo間快t;<br>(内容長(cháng)度:".strlen($conte頻但nt).")<br>";
20:  我如; 都明  事村; ec民站ho "<hr&得鐘gt;";
21: &nbs們花p; &nbs匠影p; &志秒nbsp; 老有 echo "用nl2br()處理接收到的内容,然後(hòu)輸出:<br>";
22:  空秒; &nbs新藍p; &n見厭bsp; echo 文知nl2br($content);
23:  老放;  鄉少; &n信到bsp; &n光時bsp; echo &quo坐答t;<br>(内容長(cháng)度:".strlen(nl2br($content)).")<br>";
24:  體土; &n制著bsp; }
25: &nbs木民p; ?>
26:  爸答; </BODY>
27: </HTML&g鐵知t;
本程序首先創建了一個TextArea多行文本輸入框,并要求輸入一段包含回車的文字。之所的農以要求包含回車,就(jiù)是因爲nl2br()函數處理的對(duì)象就(jiù)是回車。如果不包含回車就(jiù)無法測試老業其效果。不妨輸入“子醜寅卯↙辰巳午未↙申酉戌亥”,其中“↙”表示你光按下鍵盤上的回車鍵。這(zhè服用)時(shí)點擊“提交看效果”按鈕,出現說她圖8-10所示的運行結果。
圖8-10 程序8-11.php的運行結果
通過(guò)圖8-10可以清楚地看到nl2br土話()函數的效果。在未使用nl2br()函數對(duì)接收到的内容進(jì會舊n)行處理時(shí),本來輸入了3行内容東物,在網頁中顯示時(shí)全都(熱飛dōu)連成(chéng)了一行。這(zhè)是因爲HTML語言不識兒長别回車換行符号,無論在HTML代碼中連續輸入多門飛少個回車換行,都(dōu)不會(空小huì)在網頁上看到效果,就(jiù)服這是因爲浏覽器會(huì)忽略掉HTML代碼中的回車換行。用nl2白年br()對(duì)内容進(jìn)行處理後(hòu),每刀頻一行前面(miàn)都(dōu)自動添加了一個“<br>那技;”标記。這(zhè)個标記就(jiù)短化是通常用的HTML中的換行标記“<br>”,不過(guò)是寫物爸法略有不同而已。原本輸入的三行内容,便正常地顯示出來。
此外,通過(guò)比較nl2br()處理前和處理後(hòu)的字符串長(cháng)度,也可以制多看出此函數的工作原理。未處理之前提交的數據内容由12個漢字和兩(liǎng)個回車換行構成(chéng),長(chán遠醫g)度爲12*2 2*2=28(每次按下鍵盤的回車鍵都(dōu)會(huì)學數産生一個換行和一個回車兩(liǎng)呢金個字符)。而用nl2br()函數處理之後(hòu),數據内容長(c間不háng)度變成(chéng)40,增加了12字節。而12字節恰好(hǎo)是2個“<br>”的長(cháng)度(注意br和/之間的空格也占一個字節)。因此,足以證明nl2br()函數的作用是在被(bèi)處理的字符串票畫中每一行之前插入一個“<br>”标記。它并沒(méi)有替換掉任何内容。
雖然nl2br()函數的本質并沒(méi)有進(jìn)行替換,但在使用道匠中,其效果等同于將(jiāng)回車換行務做符号替換爲HTML換行标記。因此在不嚴格要求的前提下,可以稱之爲字符替換函數。
2.str_replace()函數
PHP提供的str_replace函數將(jiāng)一個字符串中的任意子串全部替換爲另外一個子串,火光其使用格式如下:
mixed str_replace 站她( mixed search, mixed replac花區e, mixed subject玩你 [, int &count]校人 )
這(zhè)個格式看起(qǐ)來有點複雜。簡單地解釋爲:str_replace()函數將(jiāng)subject中的所有search替換成(chéng)replace,并把替換的次數存放在count中,其中count參數爲可選。這(zhè)裡(lǐ司費)的search、repalce、subject以及整個函數的返回值都(dōu頻樂)是mixed類型,也就(jiù)說(shuō)提供的參數可以是多種(zhǒng)類草作型,常用的有字符串和數組。
1: <!--文件8-12.php:字符串替換函數綜合範例-->
2: <HTML>
3: &nb頻開sp; <HEAD>
4: 腦亮  腦火; <TITLE>字符串替換函數綜合範例</TITLE>
5: &l妹票t;/HEAD>
6: &科很lt;BODY>
7: &n現藍bsp; &n數媽bsp; <?ph快分p
8: &n雪照bsp; &木銀nbsp; 要師 //單個字符替換
9: &n去電bsp; &nbs紅新p;  鄉得; $str = "當所有的人[逗]離開(kāi)我的時(shí)候[逗]你勸我要耐心等候[句]";
10: &nbs費車p;  和子; &nbs嗎舊p; &為理nbsp; echo "原字符串:<b>".$str."</b計空><br>";
11: &nbs山從p; 西喝 $str = st哥土r_replace("[拿作","(",$str聽森);
12:  這光; &nb頻靜sp; &nbs視城p; $str = str_replace(&q訊愛uot;]",")&quo請跳t;,$str);
13: &離呢nbsp; 海通 echo校間 "字符替換之後(hòu):<b>".$str制劇."</b><br>";
14: 學們  家從; &nb從章sp; //字符串替換
15: 店冷 &nb朋都sp; $str = str_re遠內place("(逗)",",",$str);
16:  麗的; &n到匠bsp; 他媽 $str =兒兒 str_replace("(句)","。",$str);
17: &nbs算信p; &n湖科bsp; &nb木刀sp; ech場煙o "字符串替換之後(hòu):<b>".$str."&l對靜t;/b><br>&q事信uot;;
18: &nbs動微p;  睡山; ?>
19: &l做謝t;/BODY>
20: </HTML>
在程序8-12.php中,構造了一個字符串,其中逗号用“[逗]”明近表示,句号用“[句]”表示。第10~11行分别進(jìn)行了兩(liǎng)次替換,將(jiāng)字符“[”、“]舞時”分别替換成(chéng)“(”、“裡子)”。然後(hòu)輸出替換後(hòu)的暗鄉字符串。在第14~15行,又進(jìn)行了兩(liǎng)次農錯替換,將(jiāng)“(逗)”替換成(chéng)“,”,森下將(jiāng)“(句)”替換成(chéng)“。”,地刀然後(hòu)將(jiāng)最終的字符書訊串輸出。本程序運行結果如圖8-11所示。
圖8-11 程序8-12.php的運行結果
程序8-12.php主要用到了str_replace新空()函數的普通字符串替換功能(néng)。str_replace()函數還妹好(hái)可以接收一個數組參數,來實現批量的替換錢開。將(jiāng)8-12.php進(jìn)行修改,得到程序8-1關腦3.php
1: <!--文件8-13.php:字符串替換函數高級應用-->
2: <HTML>
3: <HE相雨AD>
4: &子爸nbsp;  我從; <TITLE>字符串替換函數高級應用</TITLE>
5: </多光HEAD>
6: <BODY&自員gt;
7: &nbs章為p; <?php你東
8:  高空; &n和筆bsp; &技微nbsp; //單個字符替換
9: &nbs嗎廠p; &nbs明不p; &nb服國sp;$str = "當所有的人[逗]離開(kāi)我的時(shí)候[逗]你勸我要耐心等候[句]";
10:  愛舊; 從舞 echo "原字符串:<b>".$str."&l人兵t;/b><br>&qu醫輛ot;;
11: &nb亮體sp; &件又nbsp; $arr1 = 冷拿 array("[","]學制");
12:  議秒; &nbs長湖p; &廠男nbsp; $arr2 志書= array("(",")");
13: &nbs跳風p; &nbs花頻p; &nbs自雪p;$str = str_replace($arr1,$a綠能rr2,$str);
14: 答去  電海; &男我nbsp; ec到弟ho "字符替換之後(hòu):<b>".$str."&和西lt;/b><br>";文新
15: &nbs身說p; &n事多bsp; //字符串替換
16: &就輛nbsp; &nbs劇笑p; $arr3 = array(&qu有慢ot;(逗)","(句)");
17: &nb動答sp; 嗎資 $arr4外吃 = array(",","。");
18: 靜個 &nb資媽sp; &n空地bsp; $str = str_replace($ar我白r3,$arr4,$str);
19: &n相低bsp;  筆志; &nb但你sp; echo "字符串替換之後(hòu):<b>".$str.&黃房quot;</b>&l黃女t;br>";
20: &n這白bsp;  到理; ?>
21: 藍說 </BODY>
22: </HTML>
讀者可以發(fā)現,程序8-13.php在使用str_replace()函數時(shí)傳遞了2個數組作爲參數,第1個數組按順序存放了要被(bèi)替換的字符串我多,第2個數組按順序存放了要替換成(chéng)的字符串。這(zhè)樣(y話和àng),不論要替換多少個字符串,隻要按照順序湖自分别存放在2個數組中,然後(hòu)調用str_repalce()函數即可完成(chéng),這(zhè)樣(yàng)做有明顯的優點,窗算在要替換的項目很多的情況下,可以很大程度的簡著畫化程序。
本程序的運行結果與8-12.php完全相同,運行結果圖可參見圖8-11。
8.3.3.6 字符串截取函數
在編程中經(jīng)常遇到要將(jiāng)一個字符串的一部來時分單獨取出的情況,也就(jiù)是西相字符串的截取。PHP中常用字符串截取函數有substr()等。
substr()函數的使用格式如下:
string substr ( string string, int sta媽和rt [, int length] 劇明)
本函數返回一個字符串中從指定位置開(kāi)始指定長(cháng)好服度的子串。參數string爲原始字符串,start爲截取的起(qǐ)始位置(從0開(kāi)始計),可選參數length爲要截取的長(cháng)度。值得一提的是,參數start和length均可以用負數,start爲負數時(shí)說(shuō)明從倒數第start個字符開(kāi)始取;length爲負數時(shí)表示從start位置開(kāi)始取,向(xiàng)前取length個字符結束。
1: <!--文件8-14.php:字符串的截取-->
2: <HTML村草>
3: <服還HEAD>
4: &nbs農海p; 小拍 <了數;TITLE>字符串的截取</TITLE>
5: &n船車bsp; </HEAD>
6: &nb她小sp; <BODY>
7: 雪見 &好喝nbsp; <?php
8: 數機 資銀 &nbs說友p; //構造字符串
9: 厭很 &nb視少sp;  通來; 報中 $str = "ABCDEFGHIJKLMN樂來OPQRSTUVWXYZ";
10: 現哥 &nb腦農sp; &照文nbsp; &n說機bsp;echo "原字符串:<b>".$str."<多議;/b><br>";
11: 紙用 &n費聽bsp; &nb你業sp; 坐體//按各種(zhǒng)方式進(jìn)行截取
12: &n鄉南bsp; &司湖nbsp; &nb歌藍sp; $str紅畫1 = substr($str,林媽5);
13:  也大;  慢輛; &nbs歌如p; echo "從第5個字符開(kāi)始取至最後(hòu):".$str1."<br>"著草;
14:  微美; &nb秒們sp; &nbs音外p; $str2 票慢= substr($str,9,4現地);
15: &n訊東bsp; &n讀我bsp; &n日黃bsp; echo &quo風雜t;從第9個字符開(kāi)始取4個字符:".$str2."<br>跳作;";
16: &劇那nbsp; &nbs為友p; &nb問討sp; &海遠nbsp; $str3 = substr($str,-5);
17: &nbs校麗p; &nb跳商sp; &nb老飛sp; echo "水件;取倒數5個字符:".$str3.&qu火老ot;<br>";
18: &影物nbsp; &n都爸bsp; 紙朋 $str4 = substr($str,-8,秒數4);
19:  員去; &校物nbsp; &n地吃bsp; &nbs錯學p; echo "從倒數第8個字符開(kāi)始向(xiàng)後(hòu)取4個字符:".$str4."<br>&煙行quot;;
20: &不見nbsp; &nbs討劇p; &nb也去sp; &nbs愛跳p; $str5 = substr($str,了人-8,-2);
21: &農會nbsp; &nbs東得p; &n很秒bsp; 樹們echo "從倒數第8個字符開(kāi)始取到倒數第2個字符爲止:".$str5."<br>農嗎;";
22:  玩服; ?>
23: &花行lt;/BODY>
24: </HTML>
本程序運行結果如圖8-12所示。
圖8-12 程序8-14.php的運行效果
讀者可以對(duì)照圖8-12來分析一下整個程序的運行。通過近城(guò)這(zhè)個例子讀者應當對(duì)su光體bstr()函數有一個深入的了解。尤其是start和len些我gth兩(liǎng)個參數的含義和使用方法兒遠,更應該熟練掌握。有一點值得注意紙廠:start參數爲正數時(sh匠妹í),從0開(kāi)始計數。start參數爲負數物站時(shí),從1開(kāi)始來輛計數。也就(jiù)是說(shuō)沒(méi)有“日那倒數第0個字符”。讀者可以參考本例加深理解,也可資費以自己動手編制一個程序來驗證。
8.3.3.7 字符串分割函數
在編程中有時(shí)候需要將(jiāng)一個字符串按某種(zhǒn藍和g)規則分割成(chéng)多個。PHP提供了explode()、str_split()等函數來完成(chéng)分割操作。下面(mi廠在àn)分别介紹這(zhè)2個函數。
1.explode()函數
explode()函數的格式如下:
array explode ( 少愛string separator, strin風雪g string [, int lim器門it] )
explode()函數用來將(jiāng)一個字符串信業按照某個指定的字符分割成(chéng)多段,并將(村事jiāng)每段按順序存入一個數組中。該函數的返回值愛內就(jiù)是一個數組。separator參數爲分割符,可以是一個字符串,也可以是門數單個字符。string爲要處理的字符串。參數limit爲可選,如果設置了limit,則返回的數組包含最多limit個元素,最後(hòu)一個元素將(jiān購現g)包含string的剩餘部分。
1: <!--器議文件8-15.php:字符串分割-->
2: <HTML>
3: &南公nbsp; &nbs冷大p; <HEAD>
4: &nb弟學sp;  資有; <TITLE>紙說;explode字符串分割函數</TITLE>
5: 刀生 </HE信綠AD>
6: 制身 <BODY>
7: &樂什nbsp;  現劇; <?php
8: &nb員為sp; //構造字符串
9: &nb紙玩sp; $照業str = "蘋果,空心菜,香蕉,蘿蔔,大蒜,牛肉";
10:  站民; e近土cho "原字符串:<b>".$str.&白海quot;</b><br>";快新
11: &n姐鐘bsp; echo熱北 "1.以逗号爲分割符分割字符串:<br>";
12: 畫內 &大光nbsp; $ar個姐r1 = explode(",",$str);
13: &nbs店市p; &nb事和sp; echo "風通;---$arr1[0]的值:".$arr1[0]."店少<br>";
14:  錢北; &nb著請sp; echo "車作---$arr1[4]的值:".$arr1[4]."<br>廠長";
15: &醫低nbsp; &nb師哥sp; echo "2.分割時(shí)指定limit參數:<br>";
16:  說票; &信討nbsp; $arr2 = exp就校lode(",",$str,3);
17: &n個志bsp; ech視山o "---$arr2[0]的值:".$arr2[0].&quo和雜t;<br>&qu視區ot;;
18:  術時; &n答來bsp; echo 低煙"---$arr2[2]的值:".$arr2[2]."<br>";費行
19: 電都 &如小nbsp; ec水弟ho "---$arr2[4]的值:".$arr2[4]."<br>&qu謝員ot;;
20:  去低; ?人明>
21: </BO這關DY>
22: </HTML>
程序8-15.php中,定義了一個普通字符串$str。字符串中出現了多個逗号,用explode函數來分隔這(zhè)個字符串,把“,”作爲分割字符。在未提供limit參數的情況下,字符串被(bèi)成(chéng)6小段,并存入數組$arr1中。每一小段分别對(duì)應$arr[0],$arr[1]…$arr[5]。然後(hòu)指定limit參數爲3,再次用explode函數分隔字符串$str,這(zhè)時(shí)返回的數組$arr2隻包含3個元素。即$arr2[0],$arr2[1],$arr2[2]。這(zhè)時(shí)$arr2[2]中存放的不是第3個逗号之前的内容,而是第2個逗号之後(hòu)的所有内容。程序運行結票拍果如圖8-13所示。
圖8-13 程序8-15.php的運行結果
2.str_split()函數
str_split()函數的格式爲:
array str_split ( string string [, 房個int split_length] )
str_split()函數將(jiāng)一個字符串以一定長(cháng)度爲單位分割聽動成(chéng)多段,并返回由每一段組成(chéng)的數組。str_split()函數不是以某個字符串爲分割依據,而是以一定長(cháng)度爲厭鐘分割依據。參數string爲要分割的字符串,可選參數length設置分割的單位長(cháng)度。
<!--文件8-16.php:用str_split函數分割字符串-->
1: <HTML>
2: &nb女影sp; <HEAD>
3: &爸畫nbsp; <TITL都相E>str_split字符串分割函數</TITLE>
4: </HE白請AD>
5: &nb員些sp; <BODY>
6: &nb睡友sp; <?php
7: &nbs舞冷p; 裡分//分割英文字符串
8: &可兒nbsp; $str = "Qu照雜ietly I leave,just as quietly I票樹 came.";
9:  冷雪; echo "原字符串:<b>".$str."</b>&l做公t;br>";
10:  自視; &n醫坐bsp; echo &商好quot;1.以默認長(cháng)度分割字符串:<br>";
11: &nb光北sp; 城厭 $arr1 = str_split($人資str);
12: 子和 echo "-美山--$arr1[0]的值:".$arr1[0]."<br&g通服t;";
13: &跳科nbsp; 會紅echo "---$arr1[1]的值:".$arr1[1]."<br>"司從;
14: 飛笑 echo &q笑飛uot;---$arr1[10]的值:".$arr1[10]."<br>&quo公玩t;;
15: 內呢 echo &q男舊uot;2.以指定長(cháng)度5分割字符串:<br>";
16:  山數; $arr2 筆火= str_split($str,5);
17:  錢員; echo &少化quot;---$arr2[0]的值:".$arr2[0]."<br>"哥北;;
18: 民子 &nbs是下p; echo &光小quot;---$arr2[1]的值:".$arr2[1]."<br>&q空工uot;;
19: 輛店 樹間 echo "---$arr2[5]的值:".$arr2[5]."<br>&qu舞快ot;;
20: &好媽nbsp; //測試分割中文
21: &nbs志內p; $str2=匠影"輕輕地我走了,正如我輕輕地來。";
22:  一下; echo "原字符串:<b>".快身$str2."</b><br>上這";
23: &nb光內sp;  些制; echo "1.以指定長(cháng)度5分割字符串:<br>";
24: &n章劇bsp; $arr3 她師= str_split($str2,5);
25:  的音; echo喝日 "---$arr3[小吃0]的值:".$arr3[0]." &知厭lt;br>";
26: &門通nbsp; &nbs黑內p; e舞有cho "---$arr3[1]答呢的值:".$arr3[1]." <br家腦>";
27: 讀車 &她資nbsp; &nbs章些p; echo "2.以指定長(cháng)度4分割字符串:<br>";兵明
28: &nbs購有p; $arr4 =她就 str_split($str2,4);
29: &nb舊子sp; &nb多船sp; echo "---$arr4[就文0]的值:".$arr4[0]." &相鄉lt;br>";
30: 拿為 echo "---$arr4[1]的值:".$arr4[1]." <筆照br>";
31: &nb車筆sp; 高裡 echo "---$arr4愛身[4]的值:".$arr4[4]." <b聽姐r>";
32: &nb高事sp; ?>
33: &n拍湖bsp; </BODY>
34: </HTML>
本程序運行結果如圖8-14所示。
圖8-14 程序8-16.php的運行結果
程序8-16.php中,首先構造了一個英文字符串,然後(h林西òu)用str_split函數直接分割。分割之後(hòu)字符串被(bèi不舊)一個字符一個字符的分割開(kāi)來,并且將(jiāng)這(zhè計低)些字符順次存放到數組$arr1中。通愛和過(guò)圖8-15的輸出結果,能(néng)夠印證這(z唱話hè)一點。接下來指定分割的單位爲5,這(zhè)時(shí)候字符串按站哥5個字符一段被(bèi)分割成(chéng)多段,并存儲在數組$a醫音rr2中。這(zhè)時(shí)同樣(yàng)可以看到正确的輸出結果。
前面(miàn)已經(jīng請新)提到多次,一個漢字字符占2個字節。很多字符串處理函數對(兵新duì)中文支持的并不好(hǎo)。爲了測試str_split函數分割中文的效果,又構造了一個字符串,這(zhè)個字符新不串全部由漢字字符構成(chéng)。首先用5作爲分割單位來分割字符串,通過(guò)輸出信訊結果可以看出,str_split函數無法區别中文,如第1段,取出的不是“輕輕地我走”5個漢字字符,而是“輕輕?”。這(zhè)裡(lǐ)爲什麼(me能在)會(huì)有一個“?”呢?這(zhè)個問号不是字符串中的,而是在分割字符串時術國(shí)將(jiāng)第3個字“地”分割成(chéng)了兩(liǎng)段,因此風畫無法正确顯示這(zhè)個字符,隻能(nén體放g)顯示爲“?”。
爲了解決這(zhè)個問題,又用一個偶數4作爲分割長(cháng)度,這(zhè)時(shí)吧北候漢字可以正确顯示,整個字符串以2個漢字字符爲單位被(bèi)分割成(chéng)多段。也就(樂可jiù)是說(shuō),在分割中文時(shí),分割長(cháng)度必須是花還2的倍數,否則將(jiāng)會(hu坐弟ì)導緻漢字被(bèi)分成(chéng)兩(liǎng)段而無法正确顯示。相物
縱然如此,使用函數時(shí)的廠放分割方案還(hái)有不完美之處,那就(jiù)是當一個字符串是由中英文或樹校者中文與阿拉伯數字混合而成(chéng),那即使是用2的倍數作爲分割長(cháng)度,仍然無法避免漢字被(bèi)分割的情況。店黃如字符串“110是一個重要的電話号碼”,如果以2或4作爲分割長(cháng)度,都(dōu)會(huì)導又術緻“是”這(zhè)個漢字被(bèi)不好分割。因此在使用str_split函數時(shí)必須充分考慮漢字的影響,否則會(huì)産生不可預料的結果工又。
關于字符串處理函數就(jiù)介紹到這(zh請的è)裡(lǐ)。字符串處理函數在編程中使用極爲頻繁,讀年秒者應當熟練掌握,多多積累。本節中介紹的都(dōu)是字符串處理函數書綠中最爲常用的部分,另外還(hái)有大量的函數限于篇幅無法一一公風介紹,讀者可以參考表8-1及PHP官方手冊自行學(xué)習、掌握,爲後(hòu)面(m信這iàn)學(xué)習深入的PHP編程打下基礎。
雖然在講解時(shí)每個函數都(dōu)是獨立對電地講解,但讀者應注意這(zhè)遠相些函數的結合使用。在一個程序中,可能(néng)會(huì)同藍請時(shí)用到多個函數,通過(guò)多個函數的們中綜合應用來實現一個操作,因此讀者應在這(zhè)方面(mi器放àn)多下功夫。
介紹幾個最常用的字符串函數: 字符串輸出函數 puts 多水 格式: puts(字符數組名) 功能(néng報西):把字符數組中的字符串輸出到物高顯示器。 即在屏幕上顯示該字符串。 字符串輸入函數 gets紅熱 格式: gets (字符數組名)那志 功能(néng):從标準輸入金山設備鍵盤上輸入一個字符串。 字符串連接函數 路間strcat 格式: strcat(字符數組名1,字符數組名2) 習市功能(néng):把字符數組2中的字符串連接煙醫到字符數組1 中字符串的後(hòu)面(mi員了àn),并删去字符串1後(hòu)弟請的串标志“\0”。本函數返回值是字符數組1的首地址。 字符串拷音林貝函數strcpy 格式: strcpy(字符樹遠數組名1,字符數組名2) 功能(néng):把字符數組2中的字符串拷貝新票到字符數組1中。串結束标志“\0”也一同拷貝。字符數名2,也可以是一個火火字符串常量。這(zhè)時(shí公有)相當于把一個字符串賦予一個字符數組。 字工通符串比較函數strcmp 格式: strcmp(字符數組國畫名1,字符數組名2) 功能(néng):按照ASCII碼順序比較兩(l湖空iǎng)個數組中的字符串,并由函數返回值返回比較結果。 字符串1=我放字符串2,返回值=0; 很一字符串2〉字符串2,返回值〉0; 舊動 字符串1〈字符串2,返回值〈0。 測字符串長(cháng)度函數st腦生rlen 格式: strlen(字符數組名) 美司 功能(néng):測字符串的實際長(chá麗師ng)度(不含字符串結束标志‘\0’)并要美作爲函數返回值。