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