在Web應(yīng)用中,用戶和系統(tǒng)的交互基本上是用文字來進行的,因此系統(tǒng)對文本信息,即字符串的處理非常重要。文本字符串操作內(nèi)容很多,本節(jié)將一一介紹。 3.1.1? 去除空格和其他特殊符號 有時,需要去掉字符串中的空格或者其他沒有意義的符號。例如,在一個電子商務(wù)應(yīng)用中,當(dāng)用戶填寫訂單的內(nèi)容時(如聯(lián)系地址),可能輸入一些空格、句號等字符,系統(tǒng)希望在存儲之前把它們?nèi)サ簦皇O掠幸饬x的信息。為了完成類似于上述需求的問題,PHP4及以上版本提供了4個去除字符串中特殊符號的函數(shù)。 ???? string trim(string str [, string charlist]):去除字符串str首尾處空格或其他特殊符號。 ???? string ltrim(string str [, string charlist]):去除字符串str首的空格或其他特殊符號。 ???? string rtrim(string str [, string charlist]):去除字符串str尾的空格或其他特殊符號。 ???? string chop(string str [, string charlist]):功能同rtrim()。 以上函數(shù)的第1個參數(shù)str為待操作的字符串,第2個可選參數(shù)charlist指定想要去除的特殊符號,當(dāng)缺省時默認值為去掉下列字符:空格(" ")、制表符(\t)、換行符(\n)、回車符(\r)、空值(\0)。還可以使用“..”通過第2個參數(shù)指定需要去除一個范圍內(nèi)的字符,例如“a..d”指去掉ASCII碼值介于a和d之間的字符,即a、b、c、d。 下面以trim()為例說明上述函數(shù)的使用。 ?1??? <!--去除字符串中的特殊字符:trim.php--> 2??? <?php 3??????? $init_str = ",山東省濟南市經(jīng)十路8號1. ";??? //前后都包含一個空格 4??? ????echo $init_str."#<br>"; 5??????? $trimmed_str = trim($init_str);??????? //"山東省濟南市經(jīng)十路8號1." 6??? ????echo $trimmed_str."#<br>"; 7??????? $trimmed_str = trim($init_str,', .');//"山東省濟南市經(jīng)十路8號1"。注意,第2個參數(shù)包括3個字符。 8??? ????echo $trimmed_str."#<br>"; 9??????? $trimmed_str = trim($init_str,', .0..9');??? //"山東省濟南市經(jīng)十路8號"。0..9說明要去掉所有的數(shù)字字符 10?? ????echo $trimmed_str."#<br>"; 11?? ?> 第3行定義了一個字符串變量,在其首部有空格和逗號,其尾有句號和空格; 第5行使用不帶第2個參數(shù)的trim()函數(shù)去掉了其中首尾處的空格符號; 第7行使用帶有第2個參數(shù)的trim()函數(shù)去掉了其首尾處的第2個參數(shù)中所包含的字符,即去掉了首尾處的空格、逗號和句號。 第9行trim()中第2個參數(shù)中的“0..9”說明將要去掉位于0和9的ASC碼范圍內(nèi)的所有字符。 ltrim()、rtrim()的使用同trim()類似,而chop()實際上是rtrim()的別名,其功能與rtrim()一樣,不再贅述。 3.1.2? ?加入和去除反斜杠 在許多應(yīng)用中,例如生成SQL語句時(SQL語句將在第二部分中介紹),需要在其中加入轉(zhuǎn)義字符‘\’,手工構(gòu)造起來相當(dāng)麻煩。為了解決類似問題,PHP提供了自動在字符串中加入或去除轉(zhuǎn)義字符的函數(shù)。 ???? string addcslashes(string str, string charlist):第1個參數(shù)str為待操作的原始字符串,第2個參數(shù)charlist說明需要在原始串的哪些字符前加上字符‘\’。 ???? string stripcslashes(string str):去掉字符串中的‘\’。 二者的使用參考下面代碼。 1??? <!--加入轉(zhuǎn)義字符:addcslashes.php--> 2??? <?php 3??? $init_str = "select * from Books where name = 'PHP手冊'"; 4??? echo $init_str."#<br>"; 5??? $new_str = addcslashes($init_str,"'"); 6??? echo $new_str."#<br>"; 7??? $init_str2 = stripcslashes($new_str); 8??? echo $init_str2."#<br>"; 9??? ?> 代碼在第5行在$init_str中的‘’’前加上了‘\’,又在第9行將其去掉。 3.1.3? ?生成HTML元素 HTML元素的書寫非常麻煩,下面簡單列出一些常用字符在HTML中的表示方式。 ???? '&':'&' ???? 雙引號‘"’:'"' ???? 單引號‘'’:''' ???? '<' :'<' ???? '>' :'>' 此處,稱'&'等為HTML元素,'&' 等為其顯示字符串。例如,若想在頁面上的顯示 “<a href='test'>鏈接</a>”,HTML應(yīng)寫為“<a href='test'>Test</a>”,否則,將只在頁面上顯示一個鏈接信息。 PHP提供了下面的函數(shù)來自動轉(zhuǎn)化HTML元素。 ???? string htmlspecialchars(string str [, int quote_style [, string charset]]):把一些常用的HTML元素轉(zhuǎn)換為顯示字符串。 ???? string htmlentities(string str [, int quote_style [, string charset]]):把所有的HTML元素轉(zhuǎn)換為顯示字符串。 ???? string html_entity_decode(string str [, int quote_style [, string charset]]):把顯示字符串轉(zhuǎn)化為HTML元素。 上面函數(shù)中,參數(shù)str表示原始字符串;可選參數(shù)quote_style確定是否轉(zhuǎn)換雙引號和單引號,取值范圍為{ ENT_COMPAT , ENT_QUOTES ,? ENT_NOQUOTES},分別表示只轉(zhuǎn)換雙引號、全轉(zhuǎn)換、全不轉(zhuǎn)換,缺省時默認值為ENT_COMPAT;第3個參數(shù)charset指定了轉(zhuǎn)換中所用的字符集。PHP4及以上版本所支持的字符集參考表3.1。 表3.1?????????????????????????????????????????????? PHP4及以上版本支持的字符集
下面的示例中,首先使用htmlentities()函數(shù)得到一個HTML語句的顯示字符串,然后再用html_entity_decode()函數(shù)重新把顯示字符串轉(zhuǎn)回HTML元素。運行結(jié)果如圖3.1所示。 1??? <!--生成HTML元素:htmlspecialchars.php--> 2??? <?php 3??? $orig = "我正在<b><font color=red>學(xué)習(xí)!</font></b> "; 4??? $a = htmlentities($orig,ENT_COMPAT,"GB2312"); 5??? $b = html_entity_decode($a); 6??? echo $a; // I'll "walk" the <b>dog</b> now 7??? echo $b; // I'll "walk" the <b>dog</b> now 8??? ?> 圖3.1? PHP生成HTML元素示例
除上面所提到的3個函數(shù)之外,用于HTML元素操作的函數(shù)還包括nl2br()、get_html_translation_table()等,功能與上述函數(shù)類似,本書不再一一詳述。 3.1.4? ?分解字符串 分解字符串是指把一個字符串通過特殊的符號分解為許多子串。例如,時間字符串“2005-01-01 12:59:59”可以利用符號“-”、空格和“:”分解為年月日時分秒具體的值。PHP提供了下列函數(shù)完成類似功能: ???? array split(string pattern, string str [, int limit]) 其中,參數(shù)pattern指定了作為分解標(biāo)識的符號;str為待操作的原始串;第3個可選參數(shù)limit為返回子串個數(shù)的最大值,缺省時為全部返回。函數(shù)的返回值為數(shù)組,將在3.2節(jié)對其進行介紹。此處,可以暫時把函數(shù)返回值理解為多個子串。 下面的示例可以把字符串“2005-01-01 12:59:59”分解為年月日時分秒子串。 1??? <!--分解字符串:split.php--> 2??? <?php??? 3??? $date = "2005-01-01 12:59:59"; 4??? list ($year,$month,$day,$hour,$minite,$second) = split ('[- :]',$date); 5??? echo"{$year}年{$month}月{$day}日{(diào)$hour}時{$minite}分{$second}秒<br>\n"; 6??? ?> 上例將輸出“2005年01月01日12時59分59秒”。第4行使用split函數(shù)把時間分解,分解的標(biāo)識符包括“-”、空格和“:”,在第5行將其輸出。 除split之外,功能相似的函數(shù)還包括preg_split(),explode(),implode(),chunk_split()和 wordwrap()等。 3.1.5? ?格式化字符串 格式化字符串用于按一定的格式輸出含有許多變量的文本,是最常用的一種操作。PHP的fprintf()函數(shù)完成這個功能,習(xí)慣使用C語言的讀者肯定對其感到熟悉。函數(shù)原型為: ???? string sprintf(string format, mixed [args]...) 參數(shù)format是轉(zhuǎn)換后的格式,各個變量都以“%”后的字符規(guī)定其格式,后面的多個參數(shù)以此對應(yīng)于format中的“%”處。下面示例格式化浮點數(shù)的小數(shù)部分。 1?? ?<!--格式化字符串:sprintf.php--> 2??? <? 3??? $name="張三"; 4??? $money1 = 68.75; 5??? $money2 = 54.35; 6??? $money = $money1 + $money2; 7??? // 此時變數(shù) $money 值為 "123.1"; 8??? $formatted = sprintf ("%s有¥%01.2f。",$name, $money); 9??? echo $formatted;??? //張三有¥123.10。 10?? ?> 第6行通過算術(shù)運算,得到$money的值為123.1;而在第8行通過sprintf中的%01.2定義其格式為顯示小數(shù)點后兩位。 除sprintf()之外,常用于格式化數(shù)據(jù)的函數(shù)還有printf()、sprintf()、sscanf()、fscanf()、vsprintf()和number_format()等。 3.1.6? ?獲取和替換子串 獲取子串是指從一個串中獲取其中連續(xù)的一部分。例如,從串“2005-01-01 12:59:59”中取得時間串。PHP提供了兩個函數(shù)來獲取或替換串的某一部分: ???? string substr(string str, int start [, int length]):獲取子串,第1個參數(shù)str是待操作的串,第2個參數(shù)start表明子串在總串中的起始位置,第3個可選參數(shù)指定所獲取的子串長度,如果為正數(shù)則表明子串從start向右取,否則向左?。蝗笔r默認值為從start取到串尾。 ???? string substr_replace(string str, string replacement, int start [, int length]):在獲取的基礎(chǔ)上進行替換,即將獲取出的子串替換為其第2個參數(shù)replacement。 下面的示例中,首先利用substr()獲取串“2005-01-01 12:59:59”的時間信息,然后使用substr_replace()函數(shù)將年份信息改為“2006”: 1??? <!--獲取子串:substr.php--> 2??? <? 3??????? $date = "2005-01-01 12:59:59"; 4??????? $time=substr($date,11,8);? //子串"12:59:59"的起始位置為11,長度為8 5??????? echo "time:$time<br>"; 6??????? $new_date=substr_replace($date,"2006",0,4); 7??????? echo "new date:$new_date"; 8??? ?> 3.1.7? ?定位字符 定位字符是指尋找某個字符在串中最先出現(xiàn)的位置,函數(shù)strpos()可以完成此功能。 ???? int strpos(string str, char needle):第1個參數(shù)str為待處理的串,第2個參數(shù)needle為待尋找的字符。下面這個示例,對一個電子郵件地址進行處理,首先使用strpos()尋找字符“@”,然后結(jié)合獲取子串函數(shù)strstr()獲取用戶名。 1??? <!--字符定位:strpos.php--> 2??? <? 3??????? $email = "zhangsan@php.net"; 4??????? $i=strpos($email,'@'); 5??????? $name=substr($email,0,$i); 6??????? echo $name; 7??? ?> 示例第4行使用strpos()獲取了字符’@’的位置,然后在第5行使用substr()得到用戶名子串信息。 3.1.8? ?求串長度 求串長度也是常用的操作,所使用的函數(shù)為strlen():int strlen ( string str)。 這個函數(shù)很簡單,返回字符串str的長度。仍以上一小節(jié)的例子為例,從電子郵件串中替換用戶的名字,即改為lisi@php.net。 1??? <!--字符定位:strpos.php--> 2??? <? 3??????? $email = "zhangsan@php.net"; 4??????? $i=strpos($email,'@'); 5??????? $name=substr($email,0,$i); 6??????? $email=substr_replace($email,"lisi",0,strlen($name)); 7??????? echo $email; 8??? ?> 3.1.9? 獲取ASCII編碼 把字符轉(zhuǎn)化為ASCII編碼在實際應(yīng)用中有時是很有用的,例如,字符串在數(shù)據(jù)庫中以二進制形式存放,而需要數(shù)據(jù)獲取函數(shù)返回ASCII碼串時,就需要把其轉(zhuǎn)化為字符串顯示。PHP提供的轉(zhuǎn)換ASCII碼和字符的函數(shù)有以下兩種。 ???? string chr(int ascii):把ASCII碼轉(zhuǎn)化為字符串。 ???? int ord(string string):把字符串轉(zhuǎn)化為ASCII碼。 二者的使用參考下例。 1??? <!--ASCII轉(zhuǎn)換:chr.php--> 2??? <? 3??????? $letter = chr(65);?? ???? //A 4??????? $ascii=ord('A');???????? ? //65 5??????? echo $letter; 6????? ??echo??? $ascii; 7??? ?> 3.1.10? 比較字符串 字符串的比較規(guī)則是按照字典排序方法,排在前面的小于后面的。如同在一本英語詞典中,后面的詞條大于前面的詞條。PHP實現(xiàn)字符串比較的函數(shù)如下。 ???? int strncmp(string str1, string str2[, int len]):函數(shù)的前兩個參數(shù)為待比較的兩個字符串,第3個可選參數(shù)可指定想比較二者從頭開始的多少個字符。如果str1>str2,函數(shù)返回正數(shù);str1=str2時返回0;str1<str2時返回負數(shù)。 1??? <!--ASCII轉(zhuǎn)換:chr.php--> 2??? <? 3??????? $str1="China"; 4??????? $str2="Beijing"; 5??????? $i=strcmp($str1,$str2); 6??????? echo $i;??????? //1 7??? ?> 除strcmp()之外,具有字符串比較或排序功能的函數(shù)還strcasecmp(),strncmp(),strncasecmp(),strnatcasecmp(),strstr(),natsort()和natcasesort()。 3.1.11? 大小寫轉(zhuǎn)換 比較兩個字符串是否在不區(qū)分大小寫時相等,僅僅使用上一小節(jié)的strcmp()函數(shù)就不行了,這時可將兩個字符串同時轉(zhuǎn)換為大寫或小寫,然后再進行比較即可。例如,在判斷網(wǎng)站登錄的用戶名和密碼(不區(qū)分大小寫時)時,常需要這樣。PHP實現(xiàn)字符串大小寫轉(zhuǎn)換的函數(shù)如下。 ???? string strtolower(string str):將str轉(zhuǎn)換為小寫形式。 ???? string strtoupper(string string):將str轉(zhuǎn)換為大寫形式。 ???? string ucfirst(string str):將str的第一個字符轉(zhuǎn)換為大寫形式。 ???? string ucwords(string str):將str中每一個單詞的首字母轉(zhuǎn)換為大寫形式。 參考下例。 1??? <!--大小寫轉(zhuǎn)換:Upper_Lower.php--> 2??? <? 3??????? $str1="shandong province"; 4??????? $str2="China";??? 5??????? $str1=ucwords($str1); 6??????? echo $str1;????? ???//Shangdong Province??? 7??????? $str1=strtoupper($str1); 8??????? echo $str1;??? ?????//SHANGDONG PROVINCE??? 9??????? $str2=strtolower($str2); 10?????? echo $str2;?????? ??//china 11??? ?> |
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
PHP字符串函數(shù)分類 ?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
