在做網(wǎng)站中,通常,在使用用戶輸入的字符串(通常來自HTML表單界面)之前,必須對它們進(jìn)行整理。整理字符串的第一步是清理字符串中多余的空格。雖然這一步操作不是必需的,但如果要將字符串存入一個文件或數(shù)據(jù)庫中,或者將它和別的字符串進(jìn)行比較,這就是非常有用的。為了實現(xiàn)該功能,PHP提供了3個非常有用的函數(shù)。在腳本的開始處,當(dāng)給表單輸入變量定義簡短變量名稱時,可以使用trim()函數(shù)來整理用戶輸入的數(shù)據(jù),如下所示:
$name=trim($name);
$email=trim($email);
$feedback=trim($feedback);
trim()函數(shù)可以除去字符串開始位置和結(jié)束位置的空格,并將結(jié)果字符串返回。默認(rèn)情況下,除去的字符是換行符和回車符(\n和\r)、水平和垂直制表符(\t和\v)、字符串結(jié)束符(\0)和空格。除了這個默認(rèn)的過濾字符列表外,也可以在該函數(shù)的第二個參數(shù)中提供要過濾的特殊字符。根據(jù)特定用途,可能會希望使用ltrim()函數(shù)或rtrim()函數(shù)。
這兩個函數(shù)的功能都類似于trim()函數(shù),它們都以需要處理的字符串作為輸入?yún)?shù),然后返回經(jīng)過格式化的字符串。這3個函數(shù)的不同之處在于trim()將除去整個字符串前后的空格,而ltrim()只從字符串的開始處(左邊)除去空格,rtrim()只從字符串的結(jié)束處(右邊)除去空格。PHP具有一系列可供使用的函數(shù)來重新格式化字符串,這些函數(shù)的工作方式是各不相同的。
?HTML格式化
nl2br()函數(shù)將字符串作為輸入?yún)?shù),用HTML中的<br/>標(biāo)記代替字符串中的換行符。這對于將一個長字符串顯示在瀏覽器中是非常有用的。例如,使用這個函數(shù)來格式化顧客反饋信息并將它返回到瀏覽器中:<p><? php echo nl2br($text); ?> </p>
提示:HTML將忽略純空格,所以如果不使用nl2br()函數(shù)來過濾這個輸出結(jié)果,那么它看上去就是單獨(dú)的一行。
?打印格式化
常用echo命令將字符串輸出到瀏覽器。PHP也支持print()函數(shù),它實現(xiàn)的功能與echo命令相同,但具有返回值,總是返回1。
使用函數(shù)printf()和sprintf(),還可以實現(xiàn)一些更復(fù)雜的格式。它們的工作方式基本相同,只是printf()函數(shù)是將一個格式化的字符串輸出到瀏覽器中,而sprintf()函數(shù)是返回一個格式化了的字符串。
個函數(shù)的基本語法如下:
string sprintf (string format [, mixed args...])int printf (string format [, mixed args...])
傳遞給這兩個函數(shù)的第一個參數(shù)都是字符串格式,它們使用格式代碼而不是變量來描述輸出字符串的基本形狀。其他參數(shù)是用來替換格式字符串的變量。
【示例】在使用echo時,把要用的變量直接打印至該行中,如下所示:echo "總訂單數(shù)量是:$total.";
要使用printf()函數(shù)得到相同的結(jié)果,應(yīng)該使用如下語句:printf ("總訂單數(shù)量是:%s.", $total);
格式化字符串中的%s是轉(zhuǎn)換說明。它的意思是用一個字符串來代替。在這個例子中,它會被已解釋成字符串的$total代替。如果保存在$total變量中的值是12.4,這兩種方法都將它打印為12.4。
printf()函數(shù)的優(yōu)點(diǎn)在于它可以使用更有用的轉(zhuǎn)換說明來指定$total為一個浮點(diǎn)數(shù),它的小數(shù)點(diǎn)后面應(yīng)該有兩位小數(shù),如下所示:
printf ("總訂單數(shù)量是:%.2f", $total);
經(jīng)過這行代碼的格式化處理,存儲在$total中的12.4將打印為12.40。
可以在格式化字符串中使用多個轉(zhuǎn)換說明。如果有n個轉(zhuǎn)換說明,在格式化字符串后面就應(yīng)該帶有n個參數(shù)。每個轉(zhuǎn)換說明都將按給出的順序被一個重新格式化過的參數(shù)代替。
printf ("總訂單數(shù)量是:%.2f (含運(yùn)費(fèi)%.2f) ",$total, $total-shipping);
在這里,第一個轉(zhuǎn)換說明將使用變量$total,而第二個轉(zhuǎn)換說明將使用變量$total_shipping。每一個轉(zhuǎn)換說明都遵循同樣的格式,如下所示:
%['padding-character][-][width]
[.precision]type
所有轉(zhuǎn)換說明都以%開始。如果想打印一個“%”符號,必須使用“%%”。參數(shù)padding_character是可選的。它將被用來填充變量直至所指定的寬度。該參數(shù)的作用就像使用計算器那樣在數(shù)字前面加零。默認(rèn)的填充字符是一個空格,如果指定了一個空格或0,就不需要使用“'”作為前綴。對于任何其他填充字符,必須指定“'”作為前綴。字符“-”是可選的。它指明該域中的數(shù)據(jù)應(yīng)該左對齊,而不是默認(rèn)的右對齊。參數(shù)width告訴printf()函數(shù)在這里為將被替換的變量留下多少空間(按字符計算)。
參數(shù)precision表示必須是以一個小數(shù)點(diǎn)開始。它指明了小數(shù)點(diǎn)后面要顯示的位數(shù)。
轉(zhuǎn)換說明的最后一部分是一個類型碼。其支持的所有類型碼如下表所示。
當(dāng)在類型轉(zhuǎn)換代碼中使用printf()函數(shù)時,參數(shù)的順序并不一定要與轉(zhuǎn)換說明中的順序相同。
?字符串大小寫
可以重新格式化字符串中的字母大小寫。例如,如果電子郵件中的主題行字符串是以$subject開始,可以通過幾個函數(shù)來改變它的大小寫。這些函數(shù)的功能概要如下表所示。該表的第一列顯示了函數(shù)名,第二列描述了它的功能,第三列顯示了如何在字符串$subject中使用它,最后一列顯示了該函數(shù)的返回值。
除了使用字符串函數(shù)來重新格式化一個可見的字符串之外,也可以使用其中的一些函數(shù)來重新格式化字符串,以便將其存入數(shù)據(jù)庫。對于字符串來說,某些字符肯定是有效的,但是當(dāng)將數(shù)據(jù)插入到數(shù)據(jù)庫中時可能會引起一些問題,因為數(shù)據(jù)庫會將這些字符解釋成控制符。這些有問題的字符就是引號(單引和雙引)、反斜杠(\)和NULL字符。
需要找到一種標(biāo)記或是轉(zhuǎn)義它們的辦法。以便使像MySQL這樣的數(shù)據(jù)庫能夠理解所表示的是有實際意義的特殊文本字符,而不是控制序列。為了將這些字符進(jìn)行轉(zhuǎn)義處理,可以在它們前面加一個反斜杠。例如,"(雙引號)就變成\"(反斜杠雙引號),\(反斜杠)就變成\\(反斜杠反斜杠)。這個規(guī)則對所有特殊字符都通用,所以如果在字符串中存在\\字符,就需要用\\\進(jìn)行替換。PHP提供了兩個專門用于轉(zhuǎn)義字符串的函數(shù)。在將任何字符串寫到數(shù)據(jù)庫之前,如果PHP的默認(rèn)配置還沒有啟用該功能,讀者應(yīng)該使用addSlashes()函數(shù)將它們重新格式化,例如:$feedback = addSlashes($feedback);
與許多其他字符串函數(shù)一樣,addSlashes()函數(shù)需要一個字符串作為輸入?yún)?shù),經(jīng)過該函數(shù)處理,將返回一個重新格式化后的字符串。
如果設(shè)置了PHP的配置參數(shù)magic_quotes_gpc,則PHP將自動添加或去除反斜杠。在PHP新版本的默認(rèn)安裝情況下,該指令是啟用的。gpc表示GET、POST和cookie,是第一個字母的組合。這就意味著,來自這些方法或方式的變量將被自動包括在引號內(nèi)。使用get_magic_quotes_gpc()函數(shù),可以檢查系統(tǒng)上的這個指令是否已經(jīng)啟用,如果來自這些方法的變量被自動引用在引號中,該函數(shù)將返回true。如果系統(tǒng)上該指令為啟用的,在顯示用戶數(shù)據(jù)之前,必須調(diào)用stripslashes()函數(shù);否則,這些反斜杠會被顯示出來。