1.strlen
但是要注意!如果字符串中是漢字等其他字符時候呢?
$str = "我"; echo strlen($str); //一個漢字,在UTF8格式下,顯示3, ANSI格式下顯示2
這樣一來,不符合人的自然感覺,於是,有個升級版的函數
2. mb_strlen
1 $str = "我"; 2 echo mb_strlen($str,'utf-8'); //1
要加上第二個參數才行,對待\n等轉義字符上同strlen一樣,視同一個字符
3. strpos 查找字符串$needle在字符串$haystack中首次出現的位置
stripos和strpos類似,區別是stripos不區分大小寫
strrpos和strpos類似,區別是strrpos是找最后一次出現的位置
strripos和strrpos類似,區別是它不區分大小寫
a needle in a haystack 草垛里的針,needle是針,haystack草垛。就是在草垛里找縫衣針的意思。
mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
所以,了解英語意思的話,很容易知道怎么去用。查找返回int類型位置,如果沒找到返回bool值false
注意幾點:
3.1.位置是從0開始的
//位置是從0開始的,a在 abc的 第0個位置
var_dump( strpos('abc','a') ); //int 0
3.2. 位置都是指的頭部的位置
//位置是從needle的頭部開始算 //bc 首次出現在 abcbc 的位置,索引是1
var_dump( strpos('abcbc', 'bc') ); //int 1
3.3. 第三個參數$offset指定了從什么位置開始找,默認是0,就是從頭開始找,指定位置不能為負數
//指定查找位置為2,也就是第一個c出現的位置,從c的位置(含c)開始往后找bc,bc第一次出現的位置就是3
$str = "abcbc"; var_dump( strpos($str,'bc',2) ); //int 3
3.4.處理漢字的時候出現位置的錯誤,和strlen判斷漢字長度類似
//字符串中帶漢字等 //utf-8下,一個漢字占了3個位置 $str = "a我是中國人bc"; var_dump(strpos($str,'是中')); //int 4
4.str_replace
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
4.1 所有參數都是字符串的時候,很容易理解:把$search替換成$replace,唯一要注意的是,最后那個可選參數$count,並不是你設置個1,它就替換1次,設置2,就替換2次,而是替換完成后,系統把次數賦值給$count!這個數不是你能設置的!
4.2 替換發生后,$subject的值並沒有變,只有$subject = str_replace(...);這樣$subject才會變為替換后的結果。
4.3 當$search是數組,$replace是字符串時,替換的對應關系是:$search每一項都對應$replace
4.4 $search是字符串,$replace是數組時,都替換成Array了,不要這么用,如下圖
4.5 $search和$replace都是數組的時候,是一一對應的關系,長短不一致時,看下圖
4.6 $subject可以是字符串,也可以是一維數組,是數組的話,每一子項都會查找替換。如果是數組中包含數組那種,則不替換(不工作了!)
都是替換,str_replace在查找項和替換項都是數組的時候,我們知道是一項一項的過,導致的結果:1,替換是分過程的,有先后順序的,第n次替換對第n+1次替換有影響。
舉個例子:
1 $search = array('男人','女人'); 2 $replace = array('女人','男人'); 3 $subject = '男人有錢就變壞,女人變壞就有錢'; 4 /* 5 原句是:男人有錢就變壞,女人變壞就有錢 6 想換成:女人有錢就變壞,男人變壞就有錢 7 卻得到:男人有錢就變壞,男人變壞就有錢 8 */ 9 $new_subject = str_replace($search,$replace,$subject,$count); 10 echo $new_subject; //男人有錢就變壞,男人變壞就有錢 11 echo $count; //3 12 /* 13 結果顯示:男人有錢就變壞,男人變壞就有錢 14 怎么結果里都是男人? 15 因為str_replace替換是分過程的,第n步的替換結果影響第n+1步的匹配情況。 16 第1步:找數組對應第1項,也就是男人換成女人,於是:女人有錢就變壞,女人變壞就有錢 17 第2步:找數組對應第2項,也就是女人換成男人,於是:男人有錢就變壞,男人變壞就有錢 18 結束:替換了3次 19 */
但是strtr就不一樣了!
1 /* 2 strtr 替換(注意,不是strtr,我一直以為是strstr) 3 用法1:string strtr ( string $str , string $from , string $to ) 4 strstr比較變態的,不符合直覺的地方是,不把$from和$to當成一個字符串,而是分割開來看,具體看下面的例子。 5 */ 6 echo strtr('男人有錢就變壞,女人變壞就有錢','男孩','女'); //女人有錢就變壞,女人變壞就有錢 7 /* 8 上面這一句, 9 我想是這樣的:從句子【男人有錢就變壞,女人變壞就有錢】中找到所有的【男孩】並替換成【女】,於是,沒有找到【男孩】,於是沒有替換! 10 但是,這是錯誤的!這個函數違反直覺的地方,它是下面這樣工作的: 11 把【男孩】分割開,【女】分割開,再$from[$n]和$to[$n]對應起來,對應不上的,扔了。於是,男=》女,孩對應不上,扔了 12 結果就是【女人有錢就變壞,女人變壞就有錢】 13 */ 14 echo '<br>'; 15 echo strtr('男人有錢就變壞,女人變壞就有錢','男女','女男'); 16 /* 17 上面這一句, 18 吸收了上上次的經驗,我覺得是男=》女,女=》男,我知道它不像str_replace那樣,分步驟來替換,而是同時替換。 19 這樣實現的目的是:【女人有錢就變壞,男人變壞就有錢】 20 但是現實是: 【女人有錢簱珘睏,男人珘睏簱有錢】 21 是的!!!!出現了奇怪的結果,奇怪的文字,查了下,文檔中strtr沒有寫是二進制安全的!我也不清楚會有什么結果了。 22 */ 23 24 /* 25 strtr的用法2相對安全點,我也沒有進行其他測試,歡迎留言指出問題 26 用法2:string strtr ( string $str , array $replace_pairs ) 27 $replace_pairs是數組的形式的替換規則,也就是from->to 28 因為strtr的第一種用法違反直覺,導致很容易有疑問,數組的鍵值和內容必須一樣嗎?數組的每一項鍵值和內容是當成整體來替換,還是再分隔開對應? 29 答:經測試:1.數組的鍵值和內容並不一定相同 2.數組的每一項鍵值和內容都是看成一個整體的 30 這樣來想,strtr的第一種用法,何嘗不是把字符串$from和$to分割成數組呢?第2種用法是直接給個數組,自然不再分割了。 31 同時,需要注意的是,與str_replace不同,它不是分步驟的替換 32 33 */ 34 35 echo '<br>'; 36 37 echo strtr('男人女人',array( 38 '男'=>'女', 39 '女'=>'男' 40 ) 41 ); //女人男人 42 /* 43 上面,如果是str_replace來操作的話,第一步,男變成女,於是,女人女人,第2步,女換成男,於是男人男人 44 而strtr來操作,就是【男人女人】中男變成女同時女變成男,一步操作就搞定。結果就是【女人男人】 45 */ 46 echo '<br>'; 47 echo strtr('男人女神',array( 48 '男神'=>'女', 49 '女'=>'男' 50 ) 51 ); //男人男神 52 /* 53 上面,strtr的數組中,鍵值和內容都是一個整體哦! 54 於是,男神沒有匹配的,女人替換成男,於是【男人女人】變成【男人男神】 55 */
5.截取子字符串substr
string substr ( string $string , int $start [, int $length ] )
substr在utf-8編碼下,截取漢字會亂碼哦!
1 header("Content-type:text/html;charset=UTF-8"); 2 3 $str = '我學php'; 4 var_dump(substr($str,0,3)); //我,utf-8下,一個漢字3個字節 5 echo '<br>'; 6 var_dump(substr($str,1,3));//亂碼
mb_substr和substr相比,可以用第4個參數指定編碼,是按照字符數截取的,解決了漢字亂碼問題。
1 <?php 2 header("Content-type:text/html;charset=UTF-8"); 3 4 $str = '我學php'; 5 var_dump(substr($str,0,3)); //我,utf-8下,一個漢字3個字節 6 echo '<br>'; 7 var_dump(substr($str,1,3));//亂碼 8 echo '<br>'; 9 var_dump(mb_substr($str,1,null,'utf-8')); //學php 10 ?>
6.把字符串通過分割符拆成數組explode
把數組再粘連成字符串用implode
array explode ( string $delimiter , string $string [, int $limit ] )
如果$limit是正數,則返回的數組包含最多 limit 個元素,而最后那個元素將包含 string 的剩余部分。
如果 $limit 是負數,則返回除了最后的 -limit 個元素外的所有元素。
如果 limit 是 0,則會被當做 1。
如果 delimiter
為空字符串(""), explode() 將返回 FALSE
。 如果 delimiter
所包含的值在 string
中找不到,並且使用了負數的 limit
, 那么會返回空的 array , 否則返回包含 string
單個元素的數組。
implode把數組再合成字符串
收到