常用的PHP字符串操作函數


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_substrsubstr相比,可以用第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把數組再合成字符串

 

 

 

 

收到

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM