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