主要內容:總結了第四章,主要關于字符串處理。參考書籍《精通
php5
應用開發》。
( 1 )字符串運算符
其他運算符好多與
java
類似。不過字符串鏈接符號就不同:
php
中用
'.'
。
???
(
2
)字符串分析
在某些語言里字符串是作為字符數組處理的,而
php
把字符串作為一種基本的數據類型來處理。因此,
php
使用特定的函數對字符串進行分析。
???
基本的字符串分析函數:
???
strlen
()
:計算字符串的長度
???
substr
()
:取子串
???
strpos()
和
strrpos():
計算子字符串出現的位置
??? eg:
$str = "hello php world! ";
?????? echo "<br>";?
?????? echo substr($str,10,4);
?????? echo "<br>";?
?????? echo substr($str,10);
?????? echo "<br>";?
?????? echo strpos($str,"l");
?????? echo "<br>";?
?????? echo strrpos($str,'l');
?????? echo "<br>";?
??? strpos
方法是取第一個匹配位子,
strrpos
方法是取最后一個匹配的位子。而這兩個方法需要注意一點:當
???
沒有查詢到特定字符串出現的位置時,函數將返回
FALSE
。因此判斷一個字符串中是否含有另外一個子串的正確方法是
???
使用恒等
“===”
??? eg:
??? if(strpos($str,"w")===false)
??? {//...}
(
3
)取字符串偏移
(
訪問字符串中的字符
)
如上的方法基本能對字符進行基本操作。
但是下面介紹一些方法來方便的訪問字符串的字符
???
???
一個非常好用的方法那就是使用
{}
括號來取偏移字符
。
??? eg:
??? $str= 'this is a book.';
??? echo $str{3};//output 's'
???
利用這個方法反序排列字符串:
??? $str="this is a book.";
??? $len = strlen($str);//
這里前面一直出錯,一個錯誤是因為
$len
前加了個
int
??? for($i=$len-1;$i>=0;$i--)
??? {
?????? echo $str{$i};
??? }
(
4
)字符串中的分割與連接
???
分隔字符串,可以使用函數
explode
()
,該函數有三個參數,第一個參數設置一個分割字符(串)。第二個參數指定所要操作的字符串。第三個參數可選,指定最多將字符串分割為多少子串。該函數返回一個由被分割的子串組成的數組。
eg
:
?????? <?php
??????
$this_year
=
2007
;
??????
$text
=
<<<
EOT
??????
祝無雙
,
F
,
1982
,
廣東
,
普通職員
??????
李大嘴
,
M
,
1981
,
河北
,
普通職員
??????
佟香玉
,
F
,
1980
,
山西
,
項目經理
EOT;
??????
$lines
=
explode
(
"\n"
,
$text
);
??????
foreach
(
$lines
as
$userinfo
)
??????
{
??????????
$info
=
explode
(
","
,
$userinfo
,
3
);
??????????
$name
=
$info
[
0
];
??????????
$sex
=(
$info
[
1
]==
"F"
)?
"
女
"
:
"
男
"
;
??????????
$age
=
$this_year
-
$info
[
2
];
????????
??????????
echo
"
姓名
:"
.
$name
.
" "
.
$sex
.
"
年齡:
"
.
$age
.
"<br>"
;
??????
}
???
?
?>
關于定界符
<<<
,字符串必須包含在一組定界符內。細節
結束符號必須頂格。
剛開始看書上的
EOT ,EOD
以為有什么區別,結果我試了下,隨便寫。前后對應,符合標識符的命名規則就行。
【 php 中 explode 對應 JAVA 、 javascript 里的 split 方法。】
連接字符串 implode() 函數,它的別名叫 join
eg :
???
<?
php
???
???
$fruits
=
array
(
'apple'
,
'banana'
,
'pear'
);
???
???
$tem
=
join
(
","
,
$fruits
);
???
???
echo
$tem
;
???
?
?>
javascript
里面有
join
方法,也能很方便將數組組合為字符串。
(
5
)字符串的整理
刪除字符串的空白,
trim
()
.
?????? <?php
??????
$str
=
"???????? sdf"
;
??????
echo
strlen
(
$str
);
??????
echo
"<br>"
;
??????
echo
strlen
(
trim
(
$str
));
???
?
?>
trim
刪除的是前后空格。
ltrim
、
rtrim
兩個函數也是刪除空格,一個刪除左邊空格,一個刪除右邊空格。
而且刪除的是單字節空格,當這些空格是全角空格這些函數是沒有作用的。
【?但雙字節空格在程序里怎么分的?】
(
6
)字符串的填補
str_pad 函數用于進行字符串的填補工作,
第一個參數是處理的字符串對象,第二參數是總長度,第三個參數是指長度不夠總長以什么符號來填補,第四個參數為填補左邊還是右邊(默認不寫為填補右邊)。
eg
:
???
<?
php
??????
$prices
=
array
(
??????
"
人員工資
"
=>
42840
,
"
房租
"
=>
4000
,
"
維修費
"
=>
925
,);
??????
$sum
=
0
;
??????
foreach
(
$prices
as
$title
=>
$pay
)
??????
{
??????????
$sum
+=
$pay
;
??????????
echo
str_pad
(
$title
,
15
,
"="
);
??????????
echo
str_pad
(
$pay
,
15
,
"="
,
STR_PAD_LEFT
);
??????????
echo
"
¥
<br>"
;
??????
}
??????
echo
str_repeat
(
"-"
,
30
),
"<br>"
;
??????
echo
str_pad
(
"
總支出
"
,
15
,
"="
);
?????
??????
echo
str_pad
(
$sum
,
15
,
"="
,
STR_PAD_LEFT
);
??????
echo
"
¥
<br>"
;
???
?
?>
(
7
)字符串的反轉
前面曾經講過字符串反轉的例子,實際上
php
已經內置了這個函數。
strrev
()
函數可以對字符串中的字符反序排列,這種反序是按照字節進行的。
??? <?php
???
?
?? echo strrev("hello world !");
???
??>
(8)
字符串大小寫轉換
關于字符串大小寫的轉換函數,主要有以下四個。
strtoupper
():
將給定的字符串全部轉換為大些字母
strtolower
()
:將給定的字符串全部轉換為小寫字母
ucfirst
()
:
將給定的字符串的首字母轉換為大些,其余不變。
ucwords
()
:將給定的字符串中全部單詞的首字母轉換為大寫。字符串中的單詞均以空白分隔。
??? <?php
?????? $str = "Tom Is A PHP Programer.";
?????? //
全部轉換為小寫
?????? $lower = strtolower($str);
?????? echo $lower;
?????? //
全部轉換為大寫
?????? $upper = strtoupper($str);
?????? echo $upper;
?????? //
將整句首字母大寫
?????? $string = 'hello php world!';
?????? echo ucfirst($string);
???
??>
(
9
)字符串的比較
除了運算符:
< > ===
等,還可以有以下三種方法。
按字節比較:
strcmp()
、
strcasecmp()
放入
strcmp
的兩個字符串將按照字節的
ascii
碼值進行比較。從
$str1
和
$str2
各自的首字節開始。如果前者小于后者返回負數,反之正數,相等為零。
【書上這里是錯的,他寫的是前者大于后者返回負數】
???
<?
php
??????
$test
=
strcmp
(
"Thomas"
,
"Tom"
);
??????
echo
$test
;
??????
if
(
strcmp
(
"
大連
"
,
"
大慶
"
)>
0
)
??????
{
??????????
echo
"
大連
"
;
??????
}
else
??????
{
??????????
echo
"
大慶
"
;
??????
}
???
?
?>
php 中也可以進行忽略大小寫比較,使用函數 strcasecmp (). 這就是說,同一個字符的大小寫形式認為是相等的。
按自然排序法比較
strnatcmp()
、
strnatcasecmp()
?
模擬了人類的思維習慣。
???
<?
php
???
$arr
=
array
(
???
"photo1.jpg"
,
"photo2.jpg"
,
"photo10.jpg"
,
"photo12.jpg"
,);
???
$max_str
=
$arr
[
0
];
???
for
(
$i
=
1
;
$i
<
count
(
$arr
);
$i
++)
???
{
??????
if
(
strnatcmp
(
$arr
[
$i
],
$max_str
)>
0
)
??????
{
??????????
$max_str
=
$arr
[
$i
];
??????
}
???
}
???
echo
$max_str
;
???
?
?>
本來以為輸出是
photo2.jpg
,但經過
strnatcmp
后
輸出的結果是
photo12.jpg.
strnatcasecmp
是這個函數也是忽略字母大小寫后,進行比較。
使用模糊比較
similar_text 作用在兩個字符串,返回它們中相匹配的個數。
soundex() 計算出一個關鍵值。
感覺用得少,不總結。
(
10
)字符串的替換
php 中提供了強大的字符串替換功能,可以使用 str_replace() 和 strtr() 兩個函數實現字符替換功能。他們都可以將給定字符串的指定部分用另外一個字符串替換。
str_replace() 函數有三個參數,第一個參數稱為目標對象,第二個參數是替換對象,最后一個參數是所要處理的字符串。通俗說:用第二個字符串替換第三個字符串中的第一個字符串對應的字符串。
eg :
str_replace("\\","",$json);
strtr 也叫字符串翻譯。我認為沒有必要記憶這么多相同功能的函數。 J
(
11
)字符串的格式化
在 php 中可以使用 printf() 和 sprintf() 兩個參數有相同的參數列表,并且都支持多個參數。其中,第一個參數是格式化字符串,可以包含以百分號開始,且以格式類型字符結束的格式單元。格式單元的數量可以任意。函數中余下的參數變量將按順序放到這些單元中格式化。
<?
php
??????
//
日期的表示
??????
$date
=
sprintf
(
"%04d-%02d-%02d"
,
2006
,
9
,
3
);
//
返回
"
??????
echo
$date
;
??????
//
價格的表示
??????
$money1
=
1038.45
;
??????
$money2
=
2154.75
;
??????
$sum_money
=
sprintf
(
"%
??????
echo
$sum_money
;
??????
//
整數和字符串
??????
$format
=
"There ara %d dogs in %s."
;
??????
printf
(
$format
,
"5.1"
,
"my room"
);
//
輸出
There ara 5 dogs in? my room.
??????
??????
//
一個百分比
??????
printf
(
"%
???
?
?>
格式化數字
我們經常在國際慣例中發現,表示價格或其他數字,經常用到千位分隔符。
number_format 2
種用法:
第一種:
???
<?
php
??????
$number
=
1234.5678
;
??????
echo
number_format
(
$number
);
//
沒有小數,進行了四舍五入
??????
echo
number_format
(
$number
,
2
);
//
保留
2
位小數,也進行了四舍五入
???
?
?>
這種也是我們常用的。而在個別地區的數字表示方式。例如數字的格式表示為“
1 234,
<?
php
??????
$number
=
1234.5678
;
??????
echo
number_format
(
$number
,
2
,
','
,
' '
);
?>
其中前兩個參數不用多說,第三個參數是小數點的表示,第四個參數是千位分隔符號。
關于此次 php 學習,是項目用 php ,所以我學習 php ,剛開始沒有想到 php 有那么強大。隨后發現其非常強大,但是學習筆記也不打算繼續。只是以后在 php 中遇到什么問題,準備 php 手冊隨時查閱。