1
2
3
4
5
6
7
8
9
10
11

字符串處理函數

發(fā)布時間:2017-07-20 08:04   發(fā)布人:毛書朋   浏覽次數:7068

字符串處理函數-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

                     8-2.3.png

          表8-2列出了常用的PHP字符串操作函數。

 

8.3.3.2  trim()、ltrim()、rtrim()、chop()和strlen()函數                                                     

這(zhè)5個函數中前4個函數的功能(néng)類似,因此將(jiāng)其放在一起(qǐ)介紹。chop()函數與rtrim()函數作用相同,都(dōu)是去除字符串右端的空格。ltrim()用來去除字符串左端的空格,而trim()用來去除字符串左右兩(liǎng)端的空格。

下面(miàn)來看一個例子,其中用到了另外一個字符串處理函數strlen()來獲得字符串的長(cháng)度。

1:  <!--文件8-6.php:去除字符串兩(liǎng)端空格-->

2:      <HTML>

3:      <HEAD>

4:            <TITLE>去除字符串兩(liǎng)端空格</TITLE>

5:      </HEAD>

6:      <BODY>

7:           <?php

8:               $str="  你看不到我 我是空格 ";

9:               echo "方括号中爲原始字符串:[".$str."]<br>";

10:              echo "原始字符串長(cháng)度:".strlen($str)."<br>";

11:              $str1=ltrim($str);

12:              echo "執行ltrim()之後(hòu)的長(cháng)度:".strlen($str1)."<br>";

13:              $str2=rtrim($str);

14:              echo "執行rtrim()之後(hòu)的長(cháng)度:".strlen($str2)."<br>";

15:              $str3=trim($str);

16:              echo "執行trim()之後(hòu)的長(cháng)度".strlen($str3)."<br>";

17:              echo "去掉首尾空格之後(hòu)的字符串:[".$str3."]";

18:          ?>

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個在右側(由于浏覽器會忽略掉連續的空格,因此在浏覽器中連續的兩(liǎng)個空格的顯示效果與一個空格相同)。由于每個漢字占2個字節,每個英文半角空格占1個字節,因此初始字符串的長(cháng)度爲9*2 4=22。用strlen()函數來輸出其長(cháng)度。

首先執行ltrim()函數,將(jiāng)返回結果存放在$str1中。由于ltrim()函數會去掉字符串左側的所有連續的空格,因此兩(liǎng)個空格就被去掉,$str2的字符串長(cháng)度爲20

然後(hòu)執行rtrim()函數,將(jiāng)返回結果存放在$str2中。rtrim()函數去掉了字符串$str的右側一個空格,因此$str2的長(cháng)度爲21

最後(hòu)執行trim()函數。trim()函數去除字符串左右兩(liǎng)側的所有空格,因此左側的2個空格和右側的1個空格被去掉,剩餘的部分長(cháng)度爲19。通過(guò)$str3的輸出也可以看出,字符串兩(liǎng)側的空格已經(jīng)消失。

去除連續的空格往往用在做字符串比較之前。要比較兩(liǎng)個字符串是否相同時,如果其中一個字符串首尾帶有空格,那比較結果就會爲假。如"abc""abc"這(zhè)兩(liǎng)個字符串,看似内容完全相同,但由于後(hòu)者多面(miàn)多了一個空格,在比較時會返回false。因此比較兩(liǎng)個字符串變量的值是否相同時,往往首先用trim函數處理一下兩(liǎng)側的空格。

值得注意的是,trim系列函數隻去除字符串兩(liǎng)側的空格,而不會去除中間的空格。如例8-6.php中,“你看不到我”和“我是空格”之間有一個空格。調用這(zhè)3個函數之後(hòu)空格仍然存在,說明字符串中間的空格不會受影響。如果确實想去除掉一個字符串中的所有空格,可以使用後(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:          <HTML>

3:          <HEAD>

4:              <TITLE>字符串處理中的單詞處理</TITLE>

5:          </HEAD>

6:          <BODY>

7:          <?php

8:               $str="ni hao, wo jiao Wang Xiao-ming.";

9:               echo "原始字符串:".$str."<br>";

10:              $str1=ucfirst($str);

11:              echo "執行ucfirst()之後(hòu):".$str1."<br>";

12:              $str2=ucwords($str);

13:              echo "執行ucwords()之後(hòu):".$str2."<br>";

14:              $str3=strtoupper($str);

15:              echo "執行strtoupper()之後(hòu):".$str3."<br>";

16:              $str4=strtolower($str);

17:              echo "執行strtolower()之後(hòu):".$str4."<br>";

18:              echo "字符串中一共有:".str_word_count($str)."個單詞。";

19:         ?>

20:    </BODY>

21: </HTML>

程序的運行結果如圖8-7所示。

8-7.png

8-7  程序8-7.php的運行結果

 

程序8-7.php中,構造了一個包含有6個單詞、大小寫混合的字符串,并用它來測試函數的運行結果。程序調用ucfirst()函數將(jiāng)整個字符串首字母變爲大寫,調用ucwords()函數將(jiāng)每個單詞的首字母變爲大寫,調用strtoupper()函數將(jiāng)全部字母都(dōu)變成(chéng)大寫,調用strtolower()函數將(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:      <HEAD>

4:           <TITLE>substr_count函數統計字符串出現次數</TITLE>

5:      </HEAD>

6:      <BODY>

7:          <?php

8:              $str="I am an abstract about abroad.";

9:              echo substr_count($str,"ab");

10:             echo "";

11:             echo substr_count($str,"ab",6,4);

12:         ?>

13:     </BODY>

14: </HTML>

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

substr_count($str,"ab")的作用是返回字符串"ab"在字符串$str中的次數,由于"ab"在整個字符串中出現了三次,因此值爲3

substr_count($str,"ab",6,4)的作用是返回字符串"ab"$str中的從第6個字符開(kāi)始(包含第6個字符,而且從0開(kāi)始計算),往後(hòu)數4個字符爲止(即第9個字符)之間的字符串中出現的次數。這(zhè)個描述看起(qǐ)來非常拗口和難懂。不妨換一種(zhǒng)描述方法:參數“64”限定了查找字符串的範圍。不指定參數時,substr_count函數從整個字符串$str中查找"ab"的出現次數,而指定了參數之後(hòu),substr_count函數從指定的範圍内查找"ab"的出現次數。這(zhè)個範圍就是從字符串的第6個字符開(kāi)始到第9個字符爲止的4個字符。具體到本例中,就是"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也隻會取字符串的第一個字符,其他字符無效。參數offset也是用來限制查找的範圍。

strrpos()函數的格式爲:

int strpos ( string haystack, mixed needle [, int offset] )

該函數與strrpos函數僅一字之差,但功能(néng)相差很大。strpos()函數中的needle參數允許使用一個字符串,而且返回的是這(zhè)個字符串在haystack中第一次出現的位置,而不是最後(hòu)一次出現的位置。

1:  <!--文件8-9.php:字符串查找函數的使用()-->

2:  <HTML>

3:      <HEAD>

4:          <TITLE>字符串查找函數的使用()</TITLE>

5:      </HEAD>

6:      <BODY>

7:          <?php

8:                $str="I am an abstract about abroad.";

9:                echo "原始字符串爲:".$str."<br>";

10:               echo "ab在字符串中的第一次出現位置爲:".strpos($str,"ab")."<br>";

11:               echo "ab在字符串中的最後(hòu)一次出現位置爲:".strrpos($str,"ab")."<br>";

12:                echo "abcd在字符串中第一次出現的位置爲:".strpos($str,"abcd");

13:           ?>

14:      </BODY>

15: </HTML>

本程序的運行結果如圖8-8所示。

8-8.jpg

8-8  程序8-9.php的運行結果

程序8-9.php中首先構造了一個包含多個"ab"的字符串。然後(hòu)分别調用strpos和strrpos函數來獲得"ab"子串在字符串中第一次和最後(hòu)一次出現的位置。輸出結果爲8和23。這(zhè)裡(lǐ)有兩(liǎng)點值得注意:第一點是這(zhè)裡(lǐ)的8和23都(dōu)是指從0開(kāi)始計算的,而且是從子串的第一個字母出現的位置開(kāi)始計算。如子串爲"ab",找到"ab"之後(hòu),以“a”的位置序号作爲函數的返回值,而不是“b”的位置序号。第二點是如果要查找的字符串不存在,則返回布爾值false。由于false無法直接輸出,因此最後(hòu)查找“abcd”子串時沒(méi)有任何輸出。

3strstr()函數和strrchr()函數

strstr()函數和strrchr()兩(liǎng)個函數的格式分别是:

string strstr ( string haystack, string needle )

string strrchr ( string haystack, 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:      <HEAD>

4:            <TITLE>字符串查找函數的使用()</TITLE>

5:      </HEAD>

6:      <BODY>

7:          <?php

8:                 $str="千山鳥飛絕,萬徑人蹤滅,孤舟蓑笠翁,獨釣寒江雪。";

9:                 echo "1.原始字符串爲:".$str."<br>";

10:               echo "strstr函數搜索的返回結果:".strstr($str,",達式").
"<br>";

11:               echo "strstr函數搜索孤舟的返回結果:".strstr($str,"孤舟").
"<br>";

12:                $str2="I have a great dream.";

13:                echo "2.原始字符串爲:".$str2."<br>";

14:                echo "strrchr函數搜索"e"的返回結果:".strrchr($str2,"e").

"<br>";

15:                echo "試圖用strrchr函數搜索"at"的返回結果:".strrchr($str2,"at");

16:         ?>

17:    </BODY>

18: </HTML>

程序的運行結果如圖8-9所示。

8-9.jpg

8-9  程序8-10.php的運行結果

通過(guò)深入分析本例的輸出結果,就能(néng)夠準确地把握strstr和strrchr函數的功能(néng)特點。

首先,在第一個字符串中;用strstr函數搜索逗号“,”。該函數返回字符串中第一次出現“,”的位置之後(hòu)的字符串。由于第一次出現逗号是在"千山鳥飛絕"的“絕”字之後(hòu),因此,函數的返回結果就是",萬徑人蹤滅……"(注意逗号本身也會被返回)。爲了證明strstr函數可以使用一個字符串而不僅僅單個字符作爲參數,又在字符串中搜索“孤舟”,顯然應當返回"孤舟蓑笠翁……"。和程序的運行結果相同。

然後(hòu),又構造了一個英文字母構成(chéng)的字符串"I have a great dream."。用strrchr函數在字符串中查找“e”,返回字符串中最後(hòu)一次出現“e”的位置之後(hòu)的内容,程序中3次出現“e”,但最後(hòu)一次出現是在“dream”中,于是函數返回"eam."e本身也被返回)。最後(hòu)測試是否可以把一個字符串作爲參數傳遞給strrchr函數,在字符串中查找字符串“at”。如果該函數支持字符串參數,按照上面(miàn)的分析,應當返回"at dream."。但是根據圖8-9的運行結果可知,返回的卻是“am.”。爲什麼(me)呢?因爲strrchr函數不支持字符串參數。如果提供了字符串參數,會自動截取字符串的第一個字符作爲參數。也就是說參數“at”和參數“a”所起(qǐ)的作用一樣。于是函數返回字符串中最後(hòu)一次出現“a”之後(hòu)的内容。也就是“am.”。

可能(néng)有讀者會問,爲什麼(me)要構造一個英文的字符串來講解strrchr函數呢?通過(guò)剛才的分析就已經(jīng)能(néng)夠得到答案。因爲每一個漢字都(dōu)占兩(liǎng)個字節,在函數中兩(liǎng)個字節會被認爲是多個字符(英文中一個字符占一個字節)。因此,strrchr函數就無法支持中文。也就是說不能(néng)把一個或多個中文字符作爲參數傳遞給strrchr函數。

除了strrchr函數之外,PHP中還(hái)有很多函數無法直接處理中文,這(zhè)裡(lǐ)不一一列出,讀者在學(xué)習PHP和編寫程序時應當多加注意。

 

8.3.3.5  字符串替換函數

 

字符串替換是Web編程當中極爲常用的操作,如要過(guò)濾掉用戶提交的不文明的詞語,或者處理掉字符串中包含的危險腳本,替換掉某些關鍵詞等。PHP提供了一些函數來完成(chéng)字符串替換操作,如nl2br()、str_replace()等。

1nl2br()函數

該函數的名字看起(qǐ)來比較怪,中間包含一個數字“2”,用漢語念起(qǐ)來似乎有點别扭。實際上這(zhè)裡(lǐ)的“2”在英文中念“two”,與“to”諧音。這(zhè)裡(lǐ)的“2”實際上就是“to”的一種(zhǒng)縮寫。明白了這(zhè)一點之後(hòu),函數名字和功能(néng)就一目了然了。在很多中文參考資料中,將(jiāng)此函數的功能(néng)描述爲“將(jiāng)換行符替換成(chéng)HTML的換行符<br>”,本書也沿用這(zhè)一解釋。但是如果查閱英文版PHP手冊,會發(fā)現大意爲“在每一行前插入HTML換行标記<br>”。也就是說是“插入”而不是“替換”。但是我們在使用此函數時,就其效果而言相當于“替換”,因此我們仍然采用一貫的解釋,將(jiāng)其歸爲字符串替換函數。

我們通過(guò)一個簡單例子來說明此函數的作用。

1:  <!--文件8-11.phpnl2br()函數的使用-->

2:  <HTML>

3:      <HEAD>

4:         <TITLE>nl2br()函數的使用</TITLE>

5:      </HEAD>

6:      <BODY>

7:        <form action="8-11.php" method="post">

8:              請輸入一段包含回車的文字:<br>

9:              <textarea cols="30" rows="6" name="content"></textarea>

10:             <input type=submit value="提交看效果">

11:       </form>

12:       <?php

13:            $content=$_POST["content"];

14:            //如果用戶輸入内容不爲空

15:            if($content!=""){

16:                   echo "<hr>";

17:                   echo "直接輸出接收到的内容:<br>";

18:                   echo $content;

19:                   echo "<br>(内容長(cháng)度:".strlen($content)."<br>";

20:                   echo "<hr>";

21:                   echo "nl2br()處理接收到的内容,然後(hòu)輸出:<br>";

22:                   echo nl2br($content);

23:                   echo "<br>(内容長(cháng)度:".strlen(nl2br($content))."<br>";

24:            }

25:       ?>

26:     </BODY>

27: </HTML>

本程序首先創建了一個TextArea多行文本輸入框,并要求輸入一段包含回車的文字。之所以要求包含回車,就是因爲nl2br()函數處理的對(duì)象就是回車。如果不包含回車就無法測試其效果。不妨輸入“子醜寅卯↙辰巳午未↙申酉戌亥”,其中“↙”表示按下鍵盤上的回車鍵。這(zhè)時點擊“提交看效果”按鈕,出現圖8-10所示的運行結果。

8-10.jpg

8-10  程序8-11.php的運行結果

通過(guò)圖8-10可以清楚地看到nl2br()函數的效果。在未使用nl2br()函數對(duì)接收到的内容進(jìn)行處理時,本來輸入了3行内容,在網頁中顯示時全都(dōu)連成(chéng)了一行。這(zhè)是因爲HTML語言不識别回車換行符号,無論在HTML代碼中連續輸入多少個回車換行,都(dōu)不會在網頁上看到效果,就是因爲浏覽器會忽略掉HTML代碼中的回車換行。用nl2br()對(duì)内容進(jìn)行處理後(hòu),每一行前面(miàn)都(dōu)自動添加了一個“<br>”标記。這(zhè)個标記就是通常用的HTML中的換行标記“<br>”,不過(guò)是寫法略有不同而已。原本輸入的三行内容,便正常地顯示出來。

此外,通過(guò)比較nl2br()處理前和處理後(hòu)的字符串長(cháng)度,也可以看出此函數的工作原理。未處理之前提交的數據内容由12個漢字和兩(liǎng)個回車換行構成(chéng),長(cháng)度爲12*2 2*2=28(每次按下鍵盤的回車鍵都(dōu)會産生一個換行和一個回車兩(liǎng)個字符)。而用nl2br()函數處理之後(hòu),數據内容長(cháng)度變成(chéng)40,增加了12字節。而12字節恰好(hǎo)是2個“<br>”的長(cháng)度(注意br/之間的空格也占一個字節)。因此,足以證明nl2br()函數的作用是在被處理的字符串中每一行之前插入一個“<br>”标記。它并沒(méi)有替換掉任何内容。

雖然nl2br()函數的本質并沒(méi)有進(jìn)行替換,但在使用中,其效果等同于將(jiāng)回車換行符号替換爲HTML換行标記。因此在不嚴格要求的前提下,可以稱之爲字符替換函數。

2str_replace()函數

PHP提供的str_replace函數將(jiāng)一個字符串中的任意子串全部替換爲另外一個子串,其使用格式如下:

mixed str_replace ( mixed search, mixed replace, mixed subject [, int &count] )

這(zhè)個格式看起(qǐ)來有點複雜。簡單地解釋爲:str_replace()函數將(jiāng)subject中的所有search替換成(chéng)replace,并把替換的次數存放在count中,其中count參數爲可選。這(zhè)裡(lǐ)的searchrepalcesubject以及整個函數的返回值都(dōu)是mixed類型,也就說提供的參數可以是多種(zhǒng)類型,常用的有字符串和數組。

1:  <!--文件8-12.php:字符串替換函數綜合範例-->

2:  <HTML>

3:      <HEAD>

4:            <TITLE>字符串替換函數綜合範例</TITLE>

5:      </HEAD>

6:      <BODY>

7:          <?php

8:                //單個字符替換

9:                $str = "當所有的人[]離開(kāi)我的時候[]你勸我要耐心等候[]";

10:               echo "原字符串:<b>".$str."</b><br>";

11:               $str = str_replace("[","(",$str);

12:               $str = str_replace("]",")",$str);

13:               echo "字符替換之後(hòu):<b>".$str."</b><br>";

14:               //字符串替換

15:               $str = str_replace("()","",$str);

16:               $str = str_replace("()","",$str);

17:               echo "字符串替換之後(hòu):<b>".$str."</b><br>";

18:         ?>

19:     </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-13.php

1:  <!--文件8-13.php:字符串替換函數高級應用-->

2:  <HTML>

3:     <HEAD>

4:          <TITLE>字符串替換函數高級應用</TITLE>

5:     </HEAD>

6:     <BODY>

7:        <?php

8:               //單個字符替換

 

9:               $str = "當所有的人[]離開(kāi)我的時候[]你勸我要耐心等候[]";

10:              echo "原字符串:<b>".$str."</b><br>";

11:              $arr1 =  array("[","]");

12:              $arr2 = array("(",")");

13:              $str = str_replace($arr1,$arr2,$str);

14:              echo "字符替換之後(hòu):<b>".$str."</b><br>";

15:              //字符串替換

16:              $arr3 = array("()","()");

17:              $arr4 = array("","");

18:              $str = str_replace($arr3,$arr4,$str);

19:              echo "字符串替換之後(hòu):<b>".$str."</b><br>";

20:         ?>

21:      </BODY>

22: </HTML>

讀者可以發(fā)現,程序8-13.php在使用str_replace()函數時傳遞了2個數組作爲參數,第1個數組按順序存放了要被替換的字符串,第2個數組按順序存放了要替換成(chéng)的字符串。這(zhè)樣,不論要替換多少個字符串,隻要按照順序分别存放在2個數組中,然後(hòu)調用str_repalce()數即可完成(chéng),這(zhè)樣做有明顯的優點,在要替換的項目很多的情況下,可以很大程度的簡化程序。

本程序的運行結果與8-12.php完全相同,運行結果圖可參見圖8-11

 

8.3.3.6  字符串截取函數

 

在編程中經(jīng)常遇到要將(jiāng)一個字符串的一部分單獨取出的情況,也就是字符串的截取。PHP中常用字符串截取函數有substr()等。

substr()函數的使用格式如下:

string substr ( string string, int start [, int length] )

本函數返回一個字符串中從指定位置開(kāi)始指定長(cháng)度的子串。參數string爲原始字符串,start爲截取的起(qǐ)始位置(從0開(kāi)始計),可選參數length爲要截取的長(cháng)度。值得一提的是,參數startlength均可以用負數,start爲負數時說明從倒數第start個字符開(kāi)始取;length爲負數時表示從start位置開(kāi)始取,向(xiàng)前取length個字符結束。

1:  <!--文件8-14.php:字符串的截取-->

2:  <HTML>

3:      <HEAD>

4:          <TITLE>字符串的截取</TITLE>

5:      </HEAD>

6:      <BODY>

7:           <?php

8:                  //構造字符串

9:                  $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

10:                 echo "原字符串:<b>".$str."</b><br>";

11:                 //按各種(zhǒng)方式進(jìn)行截取

12:                 $str1 = substr($str,5);

13:                 echo "從第5個字符開(kāi)始取至最後(hòu):".$str1."<br>";

14:                 $str2 = substr($str,9,4);

15:                  echo "從第9個字符開(kāi)始取4個字符:".$str2."<br>";

16:                  $str3 = substr($str,-5);

17:                  echo "取倒數5個字符:".$str3."<br>";

18:                  $str4 = substr($str,-8,4);

19:                  echo "從倒數第8個字符開(kāi)始向(xiàng)後(hòu)取4個字符:".$str4."<br>";

20:                  $str5 = substr($str,-8,-2);

21:                  echo "從倒數第8個字符開(kāi)始取到倒數第2個字符爲止:".$str5."<br>";

22:           ?>

23:      </BODY>

24: </HTML>

本程序運行結果如圖8-12所示。

8-12.jpg

8-12  程序8-14.php的運行效果

讀者可以對(duì)照圖8-12來分析一下整個程序的運行。通過(guò)這(zhè)個例子讀者應當對(duì)substr()函數有一個深入的了解。尤其是start和length兩(liǎng)個參數的含義和使用方法,更應該熟練掌握。有一點值得注意:start參數爲正數時,從0開(kāi)始計數。start參數爲負數時,從1開(kāi)始計數。也就是說沒(méi)有“倒數第0個字符”。讀者可以參考本例加深理解,也可以自己動手編制一個程序來驗證。

 

8.3.3.7  字符串分割函數

 

在編程中有時候需要將(jiāng)一個字符串按某種(zhǒng)規則分割成(chéng)多個。PHP提供了explode()str_split()等函數來完成(chéng)分割操作。下面(miàn)分别介紹這(zhè)2個函數。

1explode()函數

explode()函數的格式如下:

array explode ( string separator, string string [, int limit] )

explode()函數用來將(jiāng)一個字符串按照某個指定的字符分割成(chéng)多段,并將(jiāng)每段按順序存入一個數組中。該函數的返回值就是一個數組。separator參數爲分割符,可以是一個字符串,也可以是單個字符。string爲要處理的字符串。參數limit爲可選,如果設置了limit,則返回的數組包含最多limit個元素,最後(hòu)一個元素將(jiāng)包含string的剩餘部分。

1:  <!--文件8-15.php:字符串分割-->

2:  <HTML>

3:       <HEAD>

4:            <TITLE>explode字符串分割函數</TITLE>

5:       </HEAD>

6:       <BODY>

7:            <?php

8:             //構造字符串

9:             $str = "蘋果,空心菜,香蕉,蘿蔔,大蒜,牛肉";

10:            echo "原字符串:<b>".$str."</b><br>";

11:            echo "1.以逗号爲分割符分割字符串:<br>";

12:            $arr1 = explode("",$str);

13:            echo "---$arr1[0]的值:".$arr1[0]."<br>";

14:            echo "---$arr1[4]的值:".$arr1[4]."<br>";

15:            echo "2.分割時指定limit參數:<br>";

16:            $arr2 = explode("",$str,3);

17:            echo "---$arr2[0]的值:".$arr2[0]."<br>";

18:            echo "---$arr2[2]的值:".$arr2[2]."<br>";

19:            echo "---$arr2[4]的值:".$arr2[4]."<br>";

20:         ?>

21:     </BODY>

22: </HTML>

程序8-15.php中,定義了一個普通字符串$str。字符串中出現了多個逗号,用explode函數來分隔這(zhè)個字符串,把“,”作爲分割字符。在未提供limit參數的情況下,字符串被成(chéng)6小段,并存入數組$arr1中。每一小段分别對(duì)應$arr[0],$arr[1]…$arr[5]。然後(hòu)指定limit參數爲3,再次用explode函數分隔字符串$str,這(zhè)時返回的數組$arr2隻包含3個元素。即$arr2[0],$arr2[1],$arr2[2]。這(zhè)時$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:    <HEAD>

3:        <TITLE>str_split字符串分割函數</TITLE>

4:    </HEAD>

5:    <BODY>

6:     <?php

7:          //分割英文字符串

8:          $str = "Quietly I leave,just as quietly I came.";

9:          echo "原字符串:<b>".$str."</b><br>";

10:         echo "1.以默認長(cháng)度分割字符串:<br>";

11:         $arr1 = str_split($str);

12:         echo "---$arr1[0]的值:".$arr1[0]."<br>";

13:         echo "---$arr1[1]的值:".$arr1[1]."<br>";

14:         echo "---$arr1[10]的值:".$arr1[10]."<br>";

15:         echo "2.以指定長(cháng)度5分割字符串:<br>";

16:         $arr2 = str_split($str,5);

17:         echo "---$arr2[0]的值:".$arr2[0]."<br>";

18:         echo "---$arr2[1]的值:".$arr2[1]."<br>";

19:         echo "---$arr2[5]的值:".$arr2[5]."<br>";

20:         //測試分割中文

21:         $str2="輕輕地我走了,正如我輕輕地來。";

22:         echo "原字符串:<b>".$str2."</b><br>";

23:         echo "1.以指定長(cháng)度5分割字符串:<br>";

24:         $arr3 = str_split($str2,5);

25:         echo "---$arr3[0]的值:".$arr3[0]." <br>";

26:         echo "---$arr3[1]的值:".$arr3[1]." <br>";

27:         echo "2.以指定長(cháng)度4分割字符串:<br>";

28:         $arr4 = str_split($str2,4);

29:         echo "---$arr4[0]的值:".$arr4[0]." <br>";

30:         echo "---$arr4[1]的值:".$arr4[1]." <br>";

31:         echo "---$arr4[4]的值:".$arr4[4]." <br>";

32:     ?>

33:    </BODY>

34: </HTML>

本程序運行結果如圖8-14所示。

8-14.jpg

8-14  程序8-16.php的運行結果

程序8-16.php中,首先構造了一個英文字符串,然後(hòu)用str_split函數直接分割。分割之後(hòu)字符串被一個字符一個字符的分割開(kāi)來,并且將(jiāng)這(zhè)些字符順次存放到數組$arr1中。通過(guò)圖8-15的輸出結果,能(néng)夠印證這(zhè)一點。接下來指定分割的單位爲5,這(zhè)時候字符串按5個字符一段被分割成(chéng)多段,并存儲在數組$arr2中。這(zhè)時同樣可以看到正确的輸出結果。

前面(miàn)已經(jīng)提到多次,一個漢字字符占2個字節。很多字符串處理函數對(duì)中文支持的并不好(hǎo)。爲了測試str_split函數分割中文的效果,又構造了一個字符串,這(zhè)個字符串全部由漢字字符構成(chéng)。首先用5作爲分割單位來分割字符串,通過(guò)輸出結果可以看出,str_split函數無法區别中文,如第1段,取出的不是“輕輕地我走”5個漢字字符,而是“輕輕?”。這(zhè)裡(lǐ)爲什麼(me)會有一個“?”呢?這(zhè)個問号不是字符串中的,而是在分割字符串時將(jiāng)第3個字“地”分割成(chéng)了兩(liǎng)段,因此無法正确顯示這(zhè)個字符,隻能(néng)顯示爲“?”。

爲了解決這(zhè)個問題,又用一個偶數4作爲分割長(cháng)度,這(zhè)時候漢字可以正确顯示,整個字符串以2個漢字字符爲單位被分割成(chéng)多段。也就是說,在分割中文時,分割長(cháng)度必須是2的倍數,否則將(jiāng)會導緻漢字被分成(chéng)兩(liǎng)段而無法正确顯示。

縱然如此,使用函數時的分割方案還(hái)有不完美之處,那就是當一個字符串是由中英文或者中文與阿拉伯數字混合而成(chéng),那即使是用2的倍數作爲分割長(cháng)度,仍然無法避免漢字被分割的情況。如字符串“110是一個重要的電話号碼”,如果以24作爲分割長(cháng)度,都(dōu)會導緻“是”這(zhè)個漢字被分割。因此在使用str_split函數時必須充分考慮漢字的影響,否則會産生不可預料的結果。

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

雖然在講解時每個函數都(dōu)是獨立地講解,但讀者應注意這(zhè)些函數的結合使用。在一個程序中,可能(néng)會同時用到多個函數,通過(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è)時相當于把一個字符串賦予一個字符數組。   字符串比較函數strcmp   格式: strcmp(字符數組名1,字符數組名2) 功能(néng):按照ASCII碼順序比較兩(liǎng)個數組中的字符串,并由函數返回值返回比較結果。 字符串1=字符串2,返回值=0; 字符串2〉字符串2,返回值〉0; 字符串1〈字符串2,返回值〈0。   測字符串長(cháng)度函數strlen   格式: strlen(字符數組名) 功能(néng):測字符串的實際長(cháng)度(不含字符串結束标志‘\0’)并作爲函數返回值。