{php 字符串函數}
php操作字符串
在Web應用中,用戶和系統的交互基本上是用文字來進行的,因此系統對文本信息,即字符串的處理非常重要。文本字符串操作內容很多,本節將一一介紹。
3.1.1 去除空格和其他特殊符號
有時,需要去掉字符串中的空格或者其他沒有意義的符號。例如,在一個電子商務應用中,當用戶填寫訂單的內容時(如聯系地址),可能輸入一些空格、句號等字符,系統希望在存儲之前把它們去掉,只剩下有意義的信息。為了完成類似於上述需求的問題,PHP4及以上版本提供了4個去除字符串中特殊符號的函數。
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()。
以上函數的第1個參數str為待操作的字符串,第2個可選參數charlist指定想要去除的特殊符號,當缺省時默認值為去掉下列字符:空格(" ")、制表符(\t)、換行符(\n)、回車符(\r)、空值(\0)。還可以使用“..”通過第2個參數指定需要去除一個范圍內的字符,例如“a..d”指去掉ASCII碼值介於a和d之間的字符,即a、b、c、d。
下面以trim()為例說明上述函數的使用。
1 <!--去除字符串中的特殊字符:trim.php-->
2 <?php
3 $init_str = ",山東省濟南市經十路8號1. "; //前後都包含一個空格
4 echo $init_str."#<br>";
5 $trimmed_str = trim($init_str); //"山東省濟南市經十路8號1."
6 echo $trimmed_str."#<br>";
7 $trimmed_str = trim($init_str,', .');//"山東省濟南市經十路8號1"。注意,第2個參數包括3個字符。
8 echo $trimmed_str."#<br>";
9 $trimmed_str = trim($init_str,', .0..9'); //"山東省濟南市經十路8號"。0..9說明要去掉所有的數字字符
10 echo $trimmed_str."#<br>";
11 ?>
第3行定義了一個字符串變量,在其首部有空格和逗號,其尾有句號和空格;
第5行使用不帶第2個參數的trim()函數去掉了其中首尾處的空格符號;
第7行使用帶有第2個參數的trim()函數去掉了其首尾處的第2個參數中所包含的字符,即去掉了首尾處的空格、逗號和句號。
第9行trim()中第2個參數中的“0..9”說明將要去掉位於0和9的ASC碼范圍內的所有字符。
ltrim()、rtrim()的使用同trim()類似,而chop()實際上是rtrim()的別名,其功能與rtrim()一樣,不再贅述。
3.1.2 加入和去除反斜槓
在許多應用中,例如生成SQL語句時(SQL語句將在第二部分中介紹),需要在其中加入轉義字符‘\’,手工構造起來相當麻煩。為了解決類似問題,PHP提供了自動在字符串中加入或去除轉義字符的函數。
string addcslashes(string str, string charlist):第1個參數str為待操作的原始字符串,第2個參數charlist說明需要在原始串的哪些字符前加上字符‘\’。
string stripcslashes(string str):去掉字符串中的‘\’。
二者的使用參考下面代碼。
1 <!--加入轉義字符: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應寫為“<a href='test'>Test</a>”,否則,將只在頁面上顯示一個鏈接信息。
PHP提供了下面的函數來自動轉化HTML元素。
string htmlspecialchars(string str [, int quote_style [, string charset]]):把一些常用的HTML元素轉換為顯示字符串。
string htmlentities(string str [, int quote_style [, string charset]]):把所有的HTML元素轉換為顯示字符串。
string html_entity_decode(string str [, int quote_style [, string charset]]):把顯示字符串轉化為HTML元素。
上面函數中,參數str表示原始字符串;可選參數quote_style確定是否轉換雙引號和單引號,取值范圍為{ ENT_COMPAT , ENT_QUOTES , ENT_NOQUOTES},分別表示只轉換雙引號、全轉換、全不轉換,缺省時默認值為ENT_COMPAT;第3個參數charset指定了轉換中所用的字符集。PHP4及以上版本所支持的字符集參考表3.1。
表3.1 PHP4及以上版本支持的字符集
字 符 集
說 明
ISO-8859-1
西歐字符集
ISO-8859-15
西歐字符集擴展
UTF-8
兼容ASCII的寬字節字符集
cp1252
西歐字符集,Windows系統默認
BIG5
繁體中文,用於中國台灣省
GB2312
簡體中文,用於中國大陸
BIG5-HKSCS
繁體中文擴展,用於中國香港
Shift_JIS
日文
EUCJP
日文
下面的示例中,首先使用htmlentities()函數得到一個HTML語句的顯示字符串,然後再用html_entity_decode()函數重新把顯示字符串轉回HTML元素。運行結果如圖3.1所示。
1 <!--生成HTML元素:htmlspecialchars.php-->
2 <?php
3 $orig = "我正在<b><font color=red>學習!</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元素示例
注意
函數html_entity_decode()只支持PHP4.0.3及以上版本。
除上面所提到的3個函數之外,用於HTML元素操作的函數還包括nl2br()、get_html_translation_table()等,功能與上述函數類似,本書不再一一詳述。
3.1.4 分解字符串
分解字符串是指把一個字符串通過特殊的符號分解為許多子串。例如,時間字符串“2005-01-01 12:59:59”可以利用符號“-”、空格和“:”分解為年月日時分秒具體的值。PHP提供了下列函數完成類似功能:
array split(string pattern, string str [, int limit])
其中,參數pattern指定了作為分解標識的符號;str為待操作的原始串;第3個可選參數limit為返回子串個數的最大值,缺省時為全部返回。函數的返回值為數組,將在3.2節對其進行介紹。此處,可以暫時把函數返回值理解為多個子串。
下面的示例可以把字符串“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}日{$hour}時{$minite}分{$second}秒<br>\n";
6 ?>
上例將輸出“2005年01月01日12時59分59秒”。第4行使用split函數把時間分解,分解的標識符包括“-”、空格和“:”,在第5行將其輸出。
除split之外,功能相似的函數還包括preg_split(),explode(),implode(),chunk_split()和 wordwrap()等。
3.1.5 格式化字符串
格式化字符串用於按一定的格式輸出含有許多變量的文本,是最常用的一種操作。PHP的fprintf()函數完成這個功能,習慣使用C語言的讀者肯定對其感到熟悉。函數原型為:
string sprintf(string format, mixed [args]...)
參數format是轉換後的格式,各個變量都以“%”後的字符規定其格式,後面的多個參數以此對應於format中的“%”處。下面示例格式化浮點數的小數部分。
1 <!--格式化字符串:sprintf.php-->
2 <?
3 $name="張三";
4 $money1 = 68.75;
5 $money2 = 54.35;
6 $money = $money1 + $money2;
7 // 此時變數 $money 值為 "123.1";
8 $formatted = sprintf ("%s有¥%01.2f。",$name, $money);
9 echo $formatted; //張三有¥123.10。
10 ?>
第6行通過算術運算,得到$money的值為123.1;而在第8行通過sprintf中的%01.2定義其格式為顯示小數點後兩位。
除sprintf()之外,常用於格式化數據的函數還有printf()、sprintf()、sscanf()、fscanf()、vsprintf()和number_format()等。
3.1.6 獲取和替換子串
獲取子串是指從一個串中獲取其中連續的一部分。例如,從串“2005-01-01 12:59:59”中取得時間串。PHP提供了兩個函數來獲取或替換串的某一部分:
string substr(string str, int start [, int length]):獲取子串,第1個參數str是待操作的串,第2個參數start表明子串在總串中的起始位置,第3個可選參數指定所獲取的子串長度,如果為正數則表明子串從start向右取,否則向左取;缺省時默認值為從start取到串尾。
string substr_replace(string str, string replacement, int start [, int length]):在獲取的基礎上進行替換,即將獲取出的子串替換為其第2個參數replacement。
下面的示例中,首先利用substr()獲取串“2005-01-01 12:59:59”的時間信息,然後使用substr_replace()函數將年份信息改為“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 定位字符
定位字符是指尋找某個字符在串中最先出現的位置,函數strpos()可以完成此功能。
int strpos(string str, char needle):第1個參數str為待處理的串,第2個參數needle為待尋找的字符。下面這個示例,對一個電子郵件地址進行處理,首先使用strpos()尋找字符“@”,然後結合獲取子串函數strstr()獲取用戶名。
1 <!--字符定位:strpos.php-->
2 <?
3 $email = "[email protected]";
4 $i=strpos($email,'@');
5 $name=substr($email,0,$i);
6 echo $name;
7 ?>
示例第4行使用strpos()獲取了字符’@’的位置,然後在第5行使用substr()得到用戶名子串信息。
3.1.8 求串長度
求串長度也是常用的操作,所使用的函數為strlen():int strlen ( string str)。
這個函數很簡單,返回字符串str的長度。仍以上一小節的例子為例,從電子郵件串中替換用戶的名字,即改為[email protected]。
1 <!--字符定位:strpos.php-->
2 <?
3 $email = "[email protected]";
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編碼
把字符轉化為ASCII編碼在實際應用中有時是很有用的,例如,字符串在數據庫中以二進制形式存放,而需要數據獲取函數返回ASCII碼串時,就需要把其轉化為字符串顯示。PHP提供的轉換ASCII碼和字符的函數有以下兩種。
string chr(int ascii):把ASCII碼轉化為字符串。
int ord(string string):把字符串轉化為ASCII碼。
二者的使用參考下例。
1 <!--ASCII轉換:chr.php-->
2 <?
3 $letter = chr(65); //A
4 $ascii=ord('A'); //65
5 echo $letter;
6 echo $ascii;
7 ?>
3.1.10 比較字符串
字符串的比較規則是按照字典排序方法,排在前面的小於後面的。如同在一本英語詞典中,後面的詞條大於前面的詞條。PHP實現字符串比較的函數如下。
int strncmp(string str1, string str2[, int len]):函數的前兩個參數為待比較的兩個字符串,第3個可選參數可指定想比較二者從頭開始的多少個字符。如果str1>str2,函數返回正數;str1=str2時返回0;str1<str2時返回負數。
1 <!--ASCII轉換:chr.php-->
2 <?
3 $str1="China";
4 $str2="Beijing";
5 $i=strcmp($str1,$str2);
6 echo $i; //1
7 ?>
除strcmp()之外,具有字符串比較或排序功能的函數還strcasecmp(),strncmp(),strncasecmp(),strnatcasecmp(),strstr(),natsort()和natcasesort()。
3.1.11 大小寫轉換
比較兩個字符串是否在不區分大小寫時相等,僅僅使用上一小節的strcmp()函數就不行了,這時可將兩個字符串同時轉換為大寫或小寫,然後再進行比較即可。例如,在判斷網站登錄的用戶名和密碼(不區分大小寫時)時,常需要這樣。PHP實現字符串大小寫轉換的函數如下。
string strtolower(string str):將str轉換為小寫形式。
string strtoupper(string string):將str轉換為大寫形式。
string ucfirst(string str):將str的第一個字符轉換為大寫形式。
string ucwords(string str):將str中每一個單詞的首字母轉換為大寫形式。
參考下例。
1 <!--大小寫轉換: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字符串函數分類 1查找字符位置函數:
strpos($str,search,[int]):查找search在$str中的第一次位置從int開始;
stripos($str,search,[int]):函數返回字符串在另一個字符串中第一次出現的位置。該函數對大小寫不敏感
strrpos($str,search,[int]):查找search在$str中的最後一次出現的位置從int
2、提取子字符函數(雙字節)
submit($str,int start[,int length]):從$str中strat位置開始提取[length長度的字符串]。
strstr($str1,$str2):從$str1(第一個的位置)搜索$str2並從它開始截取到結束字符串;若沒有則返回FALSE。
stristr() 功能同strstr,只是不區分大小寫。
strrchr() 從最後一次搜索到的字符處返回;用處:取路徑中文件名
3、替換字符串
str_replace(search,replace,$str):從$str中查找search用replace來替換
str_irreplace(search,replace,$str):
strtr($str,search,replace):這個函數中replace不能為"";
substr_replace($Str,$rep,$start[,length])$str原始字符串,$rep替換後的新
字符串,$start起始位置,$length替換的長度,該項可選
4、字符長度
int strlen($str)
5、比較字符函數
int strcmp($str1,$str2):$str1>=<$str2分別為正1,0,-1(字符串比較)
strcasecmp() 同上(不分大小寫)
strnatcmp("4","14") 按自然排序比較字符串
strnatcasecmp() 同上,(區分大小寫)
6、分割成數組函數
str_split($str,len):把$str按len長度進行分割返回數組
split(search,$str[,int]):把$str按search字符進行分割返回數組int是分割幾次,後面的將不分割
expload(search,$str[,int])
7、去除空格:ltrim、rtrim、trim
8、加空格函數
chunk_split($str,2);向$str字符裡面按2個字符就加入一個空格;
9、chr、ord--返回指定的字符或ascii
10、HTML代碼有關函數
nl2br():使\n轉換為<br>。
strip_tags($str[,'<p>']):去除HTML和PHP標記
在$str中所有HTML和PHP代碼將被去除,可選參數為html和PHP代碼作用是將保留
可選參數所寫的代碼。
如:echo strip_tags($text, '<br><p>');
htmlspecialchars($str[,參數]):頁面正常輸出HTML代碼參數是轉換方式
11、字符大小寫轉換函數
strtolower($str) 字符串轉換為小寫
strtoupper($str) 字符串轉換為大寫
ucfirst($str) 將函數的第一個字符轉換為大寫
ucwords($str) 將每個單詞的首字母轉換為大寫
12、數據庫相關函數
addslashes($str):使str內單引號(')、雙引號(")、反斜線(\)與 NUL
字符串轉換為\',\",\\。
magic_quotes_gpc = On 自動對 get post cookie的內容進行轉義
get_magic_quotes_gpc()檢測是否打開magic_quotes_gpc
stripslashes() 去除字符串中的反斜槓
13、連接函數
implode(str,$arr) 將字符串數組按指定字符連接成一個字符串;implode()函數有個別名函數join
addcslashes —— 為字符串裡面的部分字符添加反斜線轉義字符
addslashes —— 用指定的方式對字符串裡面的字符進行轉義
bin2hex —— 將二進制數據轉換成十六進制表示
chr —— 返回一個字符的ASCII碼
chunk_split —— 按一定的字符長度將字符串分割成小塊
convert_cyr_string —— 將斯拉夫語字符轉換為別的字符
convert_uudecode —— 解密一個字符串
convert_uuencode —— 加密一個字符串
count_chars —— 返回一個字符串裡面的字符使用信息
crc32 —— 計算一個字符串的crc32多項式
crypt —— 單向散列加密函數
explode —— 將一個字符串用分割符轉變為一數組形式
fprintf —— 按照要求對數據進行返回,並直接寫入文檔流
get_html_translation_table —— 返回可以轉換的HTML實體
html_entity_decode —— htmlentities ()函數的反函數,將HTML實體轉換為字符
htmlentities —— 將字符串中一些字符轉換為HTML實體
htmlspecialchars_decode —— htmlspecialchars()函數的反函數,將HTML實體轉換為字符
htmlspecialchars —— 將字符串中一些字符轉換為HTML實體
implode —— 將數組用特定的分割符轉變為字符串
join —— 將數組轉變為字符串,implode()函數的別名
levenshtein —— 計算兩個詞的差別大小
localeconv —— 獲取數字相關的格式定義
ltrim —— 去除字符串左側的空白或者指定的字符
md5_file —— 將一個文件進行MD5算法加密
md5 —— 將一個字符串進行MD5算法加密
metaphone —— 判斷一個字符串的發音規則
money_format —— 按照參數對數字進行格式化的輸出
nl_langinfo —— 查詢語言和本地信息
nl2br —— 將字符串中的換行符“\n”替換成“<br />”
number_format —— 按照參數對數字進行格式化的輸出
ord —— 將一個ASCII碼轉換為一個字符
parse_str —— 把一定格式的字符串轉變為變量和值
print —— 用以輸出一個單獨的值
printf —— 按照要求對數據進行顯示
quoted_printable_decode —— 將一個字符串加密為一個8位的二進制字符串
quotemeta —— 對若干個特定字符進行轉義
rtrim —— 去除字符串右側的空白或者指定的字符
setlocale —— 設置關於數字,日期等等的本地格式
sha1_file —— 將一個文件進行SHA1算法加密
sha1 —— 將一個字符串進行SHA1算法加密
similar_text —— 比較兩個字符串,返回系統認為的相似字符個數
soundex —— 判斷一個字符串的發音規則
sprintf —— 按照要求對數據進行返回,但是不輸出
sscanf —— 可以對字符串進行格式化
str_ireplace —— 像str_replace()函數一樣匹配和替換字符串,但是不區分大小寫
str_pad —— 對字符串進行兩側的補白
str_repeat —— 對字符串進行重復組合
str_replace —— 匹配和替換字符串
str_rot13 —— 將字符串進行ROT13加密處理
str_shuffle —— 對一個字符串裡面的字符進行隨機排序
str_split —— 將一個字符串按照字符間距分割為一個數組
str_word_count —— 獲取字符串裡面的英文單詞信息
strcasecmp —— 對字符串進行大小比較,不區分大小寫
strchr —— 通過比較返回一個字符串的部分strstr()函數的別名
strcmp —— 對字符串進行大小比較
strcoll – 根據本地設置對字符串進行大小比較
strcspn —— 返回字符連續非匹配長度的值
strip_tags —— 去除一個字符串裡面的HTML和PHP代碼
stripcslashes —— 反轉義addcslashes()函數轉義處理過的字符串
stripos —— 查找並返回首個匹配項的位置,匹配不區分大小寫
stripslashes —— 反轉義addslashes()函數轉義處理過的字符串
stristr —— 通過比較返回一個字符串的部分,比較時不區分大小寫
strlen —— 獲取一個字符串的編碼長度
strnatcasecmp —— 使用自然排序法對字符串進行大小比較,不區分大小寫
strnatcmp —— 使用自然排序法對字符串進行大小比較
strncasecmp —— 對字符串的前N個字符進行大小比較,不區分大小寫
strncmp —— 對字符串的前N個字符進行大小比較
strpbrk —— 通過比較返回一個字符串的部分
strpos —— 查找並返回首個匹配項的位置
strrchr —— 通過從後往前比較返回一個字符串的部分
strrev —— 將字符串裡面的所有字母反向排列
strripos —— 從後往前查找並返回首個匹配項的位置,匹配不區分大小寫
strrpos —— 從後往前查找並返回首個匹配項的位置
strspn —— 匹配並返回字符連續出現長度的值
strstr —— 通過比較返回一個字符串的部分
strtok —— 用指定的若干個字符來分割字符串
strtolower —— 將字符串轉變為小寫
strtoupper —— 將字符串轉變為大寫
strtr —— 對字符串比較替換
substr_compare —— 對字符串進行截取後的比較
substr_count —— 計算字符串中某字符段的出現次數
substr_replace —— 對字符串中的部分字符進行替換
substr —— 對字符串進行截取
trim —— 去除字符串兩邊的空白或者指定的字符
ucfirst —— 將所給字符串的第一個字母轉換為大寫
ucwords —— 將所給字符串的每一個英文單詞的第一個字母變成大寫
vfprintf —— 按照要求對數據進行返回,並直接寫入文檔流
vprintf —— 按照要求對數據進行顯示
vsprintf —— 按照要求對數據進行返回,但是不輸出
wordwrap —— 按照一定的字符長度分割字符串