1
2
3
4
5
6
7
8
9
10
11

字符串處理函數

發(fā)布時(shí)間:2017-07-20 08:04&靜什nbsp;  發(fā)布人:毛書朋&nb校業sp;  兒我 浏覽次數:7040

字符串處理函數-1

字符串處理函數-2

字符串處理函數-3

 

關聯課件:8子項目八 - 字符串處理函數(點擊在線預覽)

 

   8.3.3  字符串處理函數

 

8.3.3.1  字符串處理函數概述

 

在web編程中,字符串是使用最爲遠筆頻繁的數據類型之一。因爲PHP不是一門強固類型化語言,因此很多數據都(d我公ōu)可以方便的作爲字符串來處理。字符串操作是編程中極爲常用的操作,討都從簡單的打印輸出一行字符串到複雜的正則表達式等,處理目标都草南(dōu)是字符串。PHP提供了大量實用的函數,可以幫助用戶完成兵又(chéng)許多複雜的字符串處理工作。PHP提供的字符串處理函木秒數及其功能(néng)如表8-2所示。

8-2.1.png

  &nb下票sp;     好下    &nb外金sp;  &nb書道sp;     8-2.3.png

     &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.jpg

圖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.png

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)如下商書。

1substr_count()函數

substr_count()函數的格式爲:

int substr_count ( string haystack的爸, string needle [, int offset [, int 通懂length]] )

substr_count()函數用來統計一個字符串needle在另一個字符串haystack中出現的次數。該函數返回值是一個整數。有兩(liǎng)個可在風選參數:offsetlength,分别表示要查找的起(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>

本例的輸出結果爲“31”。

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)描述方法:參數“64”限定了查找字符串的範圍。不指定參數時(shí),大街substr_count函數從整個字符串$str中查找"ab"的出現次數,而指定了參數之後(hòu),substr_count函數從指定的範圍内查找"ab"的出現次數。這(zhè)個範圍就(jiù)是從字符串的第6個字符開(kāi)始到第9個字符爲止的4個字符。具體到本例中,就(jiù)是"n ab"(注意na之間的一個空格也算一個字符)。顯然,在這(zhè)個範圍内,呢電"ab"隻出現了一次,因此返回1

2strrpos()函數和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.jpg

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)有任何輸出。

3strstr()函數和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.jpg

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()等。

1nl2br()函數

該函數的名字看起(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.phpnl2br()函數的使用-->

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.jpg

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換行标記。因此在不嚴格要求的前提下,可以稱之爲字符替換函數。

2str_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ǐ司費)的searchrepalcesubject以及整個函數的返回值都(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中,構造了一個字符串,其中逗号用“[逗]”明近表示,句号用“[句]”表示。第1011行分别進(jìn)行了兩(liǎng)次替換,將(jiāng)字符“[”、“]舞時”分别替換成(chéng)“(”、“裡子)”。然後(hòu)輸出替換後(hòu)的暗鄉字符串。在第1415行,又進(jìn)行了兩(liǎng)次農錯替換,將(jiāng)“(逗)”替換成(chéng)“,”,森下將(jiāng)“(句)”替換成(chéng)“。”,地刀然後(hòu)將(jiāng)最終的字符書訊串輸出。本程序運行結果如圖8-11所示。

8-11.jpg

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)度。值得一提的是,參數startlength均可以用負數,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.jpg

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個函數。

1explode()函數

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-15.jpg

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.jpg

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是一個重要的電話号碼”,如果以24作爲分割長(cháng)度,都(dōu)會(huì)導又術緻“是”這(zhè)個漢字被(bèi)不好分割。因此在使用str_split函數時(shí)必須充分考慮漢字的影響,否則會(huì)産生不可預料的結果工又。

關于字符串處理函數就(jiù)介紹到這(zh請的è)裡(lǐ)。字符串處理函數在編程中使用極爲頻繁,讀年秒者應當熟練掌握,多多積累。本節中介紹的都(dōu)是字符串處理函數書綠中最爲常用的部分,另外還(hái)有大量的函數限于篇幅無法一一公風介紹,讀者可以參考表8-1PHP官方手冊自行學(xué)習、掌握,爲後(hòu)面(m信這iàn)學(xué)習深入的PHP編程打下基礎。

雖然在講解時(shí)每個函數都(dōu)是獨立對電地講解,但讀者應注意這(zhè)遠相些函數的結合使用。在一個程序中,可能(néng)會(huì)同藍請時(shí)用到多個函數,通過(guò)多個函數的們中綜合應用來實現一個操作,因此讀者應在這(zhè)方面(mi器放àn)多下功夫。

 


  • 辛宏 2018-01-09 16:08:03
    介紹幾個最常用的字符串函數:   字符串輸出函數 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’)并要美作爲函數返回值。