一、字符串操作
PHP開(kāi)發(fā)中巩螃,我們遇到最多的可能就是字符串璧针。
一個(gè)字符串 通過(guò)下面的3種方法來(lái)定義:
1、單引號(hào)? ? ? $hello = 'hello world';單引號(hào)串中的內(nèi)容總被認(rèn)為是普通字符十厢。
2等太、雙引號(hào) ? ? ? $hello = "hello world";雙引號(hào)可以解析變量,變量用{ }分隔
3蛮放、heredoc語(yǔ)法結(jié)構(gòu)
heredoc語(yǔ)法結(jié)構(gòu)定義的字符串:
$hello =<<<TAG
hello world
TAG;
PHP中用英文的點(diǎn)號(hào).來(lái)連接兩個(gè)字符串缩抡。
1、PHP字符串之去除字符串首尾的空格
PHP中有三個(gè)函數(shù)可以去掉字符串的空格
trim去除一個(gè)字符串兩端空格包颁。
rtrim是去除一個(gè)字符串右部空格瞻想,其中的r是right的縮寫。
ltrim是去除一個(gè)字符串左部空格娩嚼,其中的l是left的縮寫蘑险。
echo trim(" ? ? ?空格 ? ? ? ")."<br/>";
echo rtrim(" ? ? ? 空格 ? ? ? ")."<br/>";
echo ltrim(" ? ? ? ?空格 ? ? ? ")."<br/>";
$str=" ? ? ? ? ? ? ?左側(cè)空格要去掉";
echo ltrim($str);
2.PHP字符串之獲取字符串的長(zhǎng)度
php中有一個(gè)神奇的函數(shù),可以直接獲取字符串的長(zhǎng)度岳悟,這個(gè)函數(shù)就是strlen()佃迄。
$str = 'hello';
$len = strlen($str);
echo $len;//輸出結(jié)果是5
strlen函數(shù)對(duì)于計(jì)算英文字符是非常的擅長(zhǎng),但是如果有中文漢字竿音,要計(jì)算長(zhǎng)度該怎么辦和屎?
可以使用mb_strlen()函數(shù)獲取字符串中中文長(zhǎng)度。
$str = "我愛(ài)你";
echo mb_strlen($str,"UTF8");//結(jié)果:3春瞬,此處的UTF8表示中文編碼是UTF8格式柴信,中文一般采用UTF8編碼
3.PHP字符串之字符串的截取
php中有非常多的字符串處理函數(shù),其中就有字符串截取函數(shù)宽气。
英文字符串的截取函數(shù)substr()
函數(shù)說(shuō)明:substr(字符串變量,開(kāi)始截取的位置随常,截取個(gè)數(shù))
$str='i love you';
//截取love這幾個(gè)字母
echo substr($str, 2, 4);//為什么開(kāi)始位置是2呢,因?yàn)閟ubstr函數(shù)計(jì)算字符串位置是從0開(kāi)始的萄涯,也就是0的位置是i,1的位置是空格绪氛,l的位置是2。從位置2開(kāi)始取4個(gè)字符涝影,就是love枣察。
中文字符串的截取函數(shù)mb_substr()
mb_substr(字符串變量,開(kāi)始截取的位置,截取個(gè)數(shù), 網(wǎng)頁(yè)編碼)
$str='我愛(ài)你,中國(guó)';
//截取中國(guó)兩個(gè)字
echo mb_substr($str, 4, 2, 'utf8');//為什么開(kāi)始位置是4呢序目,和上一個(gè)例子一樣臂痕,因?yàn)閙b_substr函數(shù)計(jì)算漢字位置是從0開(kāi)始的,也就是0的位置是我,1的位置是愛(ài)猿涨,4的位置是中握童。從位置4開(kāi)始取2個(gè)漢字,就是中國(guó)叛赚。中文編碼一般是utf8格式
4.PHP字符串之查找字符串
如果有一個(gè)字符串$str = 'I want to study at imooc';澡绩,怎么樣找到其中的imooc在哪個(gè)位置呢?
查找字符串俺附,我們需要用到PHP的查找字符串函數(shù)strpos();
函數(shù)說(shuō)明:strpos(要處理的字符串, 要定位的字符串, 定位的起始位置[可選])
$str = 'I want to study at imooc';
$pos = strpos($str, 'imooc');
echo $pos;//結(jié)果顯示19肥卡,表示從位置0開(kāi)始,imooc在第19個(gè)位置開(kāi)始出現(xiàn)
5.PHP字符串之替換字符串
替換字符串事镣,我們需要用到PHP的替換函數(shù)str_replace()
函數(shù)說(shuō)明:str_replace(要查找的字符串, 要替換的字符串, 被搜索的字符串, 替換進(jìn)行計(jì)數(shù)[可選])
$str = 'I want to learn js';
$replace = str_replace('js', 'php', $str);
echo $replace;//結(jié)果顯示I want to learn php
str_ireplace( )與str_replace( )功能相同召调,只是不區(qū)分大小寫
6.PHP字符串之格式化字符串
如果有一個(gè)字符串$str = '99.9';,怎么樣使這個(gè)字符串變成99.90呢蛮浑?
我們需要用到PHP的格式化字符串函數(shù)sprintf()
函數(shù)說(shuō)明:sprintf(格式,?要轉(zhuǎn)化的字符串)
返回:格式化好的字符串
例子:
$str = '99.9';
$result = sprintf('%01.2f', $str);
echo $result;//結(jié)果顯示99.90
解釋下唠叛,上面例子中的格式
這個(gè) %01.2f 是什么意思呢?
1沮稚、這個(gè) % 符號(hào)是開(kāi)始的意思艺沼,寫在最前面表示指定格式開(kāi)始了。 也就是 "起始字符", 直到出現(xiàn) "轉(zhuǎn)換字符" 為止蕴掏,就算格式終止障般。
2、跟在 % 符號(hào)后面的是 0盛杰, 是 "填空字元" 挽荡,表示如果位置空著就用0來(lái)填滿。
3即供、在 0 后面的是1定拟,這個(gè) 1 是規(guī)定整個(gè)所有的字符串占位要有1位以上(小數(shù)點(diǎn)也算一個(gè)占位)。
如果把 1 改成 6逗嫡,則 $result的值將為 099.90
因?yàn)榍嘧裕谛?shù)點(diǎn)后面必須是兩位,99.90一共5個(gè)占位驱证,現(xiàn)在需要6個(gè)占位延窜,所以用0來(lái)填滿。
4抹锄、在 %01 后面的 .2 (點(diǎn)2) 就很好理解了逆瑞,它的意思是荠藤,小數(shù)點(diǎn)后的數(shù)字必須占2位。 如果這時(shí)候获高,$str 的值為9.234,則 $result的值將為9.23.
為什么4 不見(jiàn)了呢商源? 因?yàn)樵谛?shù)點(diǎn)后面,按照上面的規(guī)定谋减,必須且僅能占2位。 可是 $str 的值中扫沼,小數(shù)點(diǎn)后面占了3位出爹,所以,尾數(shù)4被去掉了缎除,只剩下 23严就。
5、最后器罐,以 f "轉(zhuǎn)換字符" 結(jié)尾梢为。
7.PHP字符串之字符串的合并與分割
php字符串合并函數(shù)implode()
函數(shù)說(shuō)明:implode(分隔符[可選], 數(shù)組)
返回值:把數(shù)組元素組合為一個(gè)字符串
例子:
$arr = array('Hello', 'World!');
$result = implode('', $arr);
print_r($result);//結(jié)果顯示Hello World!
php字符串分隔函數(shù)explode()
函數(shù)說(shuō)明:explode(分隔符[可選], 字符串)
返回值:函數(shù)返回由字符串組成的數(shù)組
$str = 'apple,banana';
$result = explode(',', $str);
print_r($result);//結(jié)果顯示array('apple','banana')
8.PHP字符串之字符串的轉(zhuǎn)義
php字符串轉(zhuǎn)義函數(shù)addslashes()
函數(shù)說(shuō)明:用于對(duì)特殊字符加上轉(zhuǎn)義字符,返回一個(gè)字符串
返回值:一個(gè)經(jīng)過(guò)轉(zhuǎn)義后的字符串
例子:
$str = "what's your name?";
echo addslashes($str);//輸出:what\'s your name?
9轰坊、strtolower( )將字符串轉(zhuǎn)換為小寫字母
$str="SDADFSADDA";
echo ? strtolower($str);
10.strtoupper( )將字符串轉(zhuǎn)換為大寫字母
$str="kdsldkkdsdSDA";
echo strtoupper($str);
11.strpos( )查找一個(gè)字符串在另外一個(gè)字符串中首次出現(xiàn)的位置铸董,區(qū)分大小寫
$str="I love you just love you";
echo ? strpos($str,"love");
12.stripos( )查找一個(gè)字符串在另外一個(gè)字符串中首次出現(xiàn)的位置,不區(qū)分大小寫
$str="I LOve you";
echo ? stripos($str,"love");
13.strstr( ),字符串截取
strstr( ),字符串截取肴沫,有三個(gè)參數(shù)粟害,第一個(gè)參數(shù)要分割的字符串,第二個(gè)參數(shù)以什么作為分割(分割符)颤芬,第三個(gè)參數(shù)如果是true截取分割符前面的內(nèi)容悲幅,如果是false截取分割符后面的內(nèi)容
$str="djsffkdffjaffl";
echo ? ?strstr($str, "ff",false);
stristr( )和strstr( )功能相同,不區(qū)分大小寫
14.strrev( )反轉(zhuǎn)字符串
$str="hello world";
echo strrev($str);
15.nl2br( )將字符串中的換行(\n)轉(zhuǎn)換成HTML換行標(biāo)簽<br/>
$str="hello \n world";
echo nl2br($str);
16.strip_tags( )刪除字符串中HTML ? ? XML ? PHP標(biāo)簽
string strip_tags ( string str [, string allowable_tags] )
可選參數(shù)allowable_tags指定要保留的標(biāo)簽
$str="test<a >163<a>";
echo strip_tags($str);
17.htmlspecialchars( )函數(shù)把一些預(yù)定義的字符轉(zhuǎn)換為HTML實(shí)體
$str="<h1>我是一級(jí)標(biāo)題</h1>";
echo ? ?htmlspecialchars($str);
二站蝠、正則表達(dá)式
1汰具、什么叫正則表達(dá)式
正則表達(dá)式是對(duì)字符串進(jìn)行操作的一種邏輯公式,就是用一些特定的字符組合成一個(gè)規(guī)則字符串菱魔,稱之為正則匹配模式留荔。
$p = '/apple/';
$str = "apple banna";
if (preg_match($p, $str)) {
echo 'matched';
}
其中字符串'/apple/'就是一個(gè)正則表達(dá)式,他用來(lái)匹配源字符串中是否存在apple字符串澜倦。
PHP中使用PCRE庫(kù)函數(shù)進(jìn)行正則匹配存谎,比如上例中的preg_match用于執(zhí)行一個(gè)正則匹配,常用來(lái)判斷一類字符模式是否存在肥隆。
2.正則表達(dá)式的基本語(yǔ)法
PCRE庫(kù)函數(shù)中既荚,正則匹配模式使用分隔符與元字符組成,分隔符可以是非數(shù)字栋艳、非反斜線恰聘、非空格的任意字符。經(jīng)常使用的分隔符是正斜線(/)、hash符號(hào)(#) 以及取反符號(hào)(~)晴叨,例如:
/foo bar/
#^[^0-9]$#
~php~
如果模式中包含分隔符凿宾,則分隔符需要使用反斜杠(\)進(jìn)行轉(zhuǎn)義。
/http:\/\//
如果模式中包含較多的分割字符兼蕊,建議更換其他的字符作為分隔符初厚,也可以采用preg_quote進(jìn)行轉(zhuǎn)義。
$p = 'http://';
$p = '/'.preg_quote($p, '/').'/';
echo ?$p;? ? ? // ?/http\:\/\//
分隔符后面可以使用模式修飾符孙技,模式修飾符包括:i ?产禾,m,s牵啦,x等亚情,例如使用i修飾符可以忽略大小寫匹配:
$str = "Http://www.imooc.com/";
if (preg_match('/http/i', $str)) {
echo '匹配成功';
}
3.元字符與轉(zhuǎn)義
正則表達(dá)式中具有特殊含義的字符稱之為元字符,常用的元字符有:
\ 一般用于轉(zhuǎn)義字符
^ 斷言目標(biāo)的開(kāi)始位置(或在多行模式下是行首)
$ 斷言目標(biāo)的結(jié)束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認(rèn))
[ 開(kāi)始字符類定義
] 結(jié)束字符類定義
| 開(kāi)始一個(gè)可選分支
( 子組的開(kāi)始標(biāo)記
) 子組的結(jié)束標(biāo)記
? 作為量詞哈雏,表示 0 次或 1 次匹配楞件。位于量詞后面用于改變量詞的貪婪特性。 (查閱量詞)
* 量詞裳瘪,0 次或多次匹配
+ 量詞土浸,1 次或多次匹配
{ 自定義量詞開(kāi)始標(biāo)記
} 自定義量詞結(jié)束標(biāo)記
/下面的\s匹配任意的空白符,包括空格彭羹,制表符栅迄,換行符。[^\s]代表非空白符皆怕。[^\s]+表示一次或多次匹配非空白符毅舆。
$p = '/^我[^\s]+(蘋果|香蕉)$/';
$str = "我喜歡吃蘋果";
if (preg_match($p, $str)) {
echo '匹配成功';
}
元字符具有兩種使用場(chǎng)景,一種是可以在任何地方都能使用愈腾,另一種是只能在方括號(hào)內(nèi)使用憋活,在方括號(hào)內(nèi)使用的有:
\ 轉(zhuǎn)義字符
^ 僅在作為第一個(gè)字符(方括號(hào)內(nèi))時(shí),表明字符類取反
- 標(biāo)記字符范圍
其中^在反括號(hào)外面虱黄,表示斷言目標(biāo)的開(kāi)始位置悦即,但在方括號(hào)內(nèi)部則代表字符類取反,方括號(hào)內(nèi)的減號(hào)-可以標(biāo)記字符范圍橱乱,例如0-9表示0到9之間的所有數(shù)字辜梳。
//下面的\w匹配字母或數(shù)字或下劃線。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的郵箱是Spark.eric@imooc.com";
preg_match($p, $str, $match);
echo $match[0];
4.貪婪模式與懶惰模式
正則表達(dá)式中每個(gè)元字符匹配一個(gè)字符泳叠,當(dāng)使用+之后將會(huì)變的貪婪作瞄,它將匹配盡可能多的字符,但使用問(wèn)號(hào)?字符時(shí)危纫,它將盡可能少的匹配字符宗挥,既是懶惰模式乌庶。
貪婪模式:在可匹配與可不匹配的時(shí)候,優(yōu)先匹配
//下面的\d表示匹配數(shù)字
$p = '/\d+\-\d+/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結(jié)果為:010-12345678
懶惰模式:在可匹配與可不匹配的時(shí)候契耿,優(yōu)先不匹配
$p = '/\d?\-\d?/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0];? //結(jié)果為:0-1
當(dāng)我們確切的知道所匹配的字符長(zhǎng)度的時(shí)候瞒大,可以使用{}指定匹配字符數(shù)
$p = '/\d{3}\-\d{8}/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結(jié)果為:010-12345678
5.使用正則表達(dá)式進(jìn)行匹配
使用正則表達(dá)式的目的是為了實(shí)現(xiàn)比字符串處理函數(shù)更加靈活的處理方式,因此跟字符串處理函數(shù)一樣搪桂,其主要用來(lái)判斷子字符串是否存在透敌、字符串替換、分割字符串踢械、獲取模式子串等酗电。
PHP使用PCRE庫(kù)函數(shù)來(lái)進(jìn)行正則處理,通過(guò)設(shè)定好模式裸燎,然后調(diào)用相關(guān)的處理函數(shù)來(lái)取得匹配結(jié)果。
preg_match用來(lái)執(zhí)行一個(gè)匹配泼疑,可以簡(jiǎn)單的用來(lái)判斷模式是否匹配成功德绿,或者取得一個(gè)匹配結(jié)果,他的返回值是匹配成功的次數(shù)0或者1退渗,在匹配到1次以后就會(huì)停止搜索移稳。
$subject = "abcdef";
$pattern = '/def/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結(jié)果為:Array ( [0] => def )
上面的代碼簡(jiǎn)單的執(zhí)行了一個(gè)匹配,簡(jiǎn)單的判斷def是否能匹配成功会油,但是正則表達(dá)式的強(qiáng)大的地方是進(jìn)行模式匹配个粱,因此更多的時(shí)候,會(huì)使用模式:
$subject = "abcdef";
$pattern = '/a(.*?)d/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結(jié)果為:Array ( [0] => abcd [1] => bc )
通過(guò)正則表達(dá)式可以匹配一個(gè)模式翻翩,得到更多的有用的數(shù)據(jù)都许。
6.查找所有匹配結(jié)果
preg_match只能匹配一次結(jié)果,但很多時(shí)候我們需要匹配所有的結(jié)果嫂冻,preg_match_all可以循環(huán)獲取一個(gè)列表的匹配結(jié)果數(shù)組胶征。
$p = "|<[^>]+>(.*?)]+>|i";
$str = "<b>example:</b><div align=left>this is a test</div>";
preg_match_all($p, $str, $matches);
print_r($matches);? // ? ? Array([0] => Array()[1] => Array())
可以使用preg_match_all匹配一個(gè)表格中的數(shù)據(jù):
$p="/<tr><td>(.*?)<\/td>\s*<td>(.*?)<\/td>\s*<\/tr>/i/";
$str="<table><tr><td>Eric</td><td>25</td></tr><tr><td>john</td><td>26</td></tr>john</td><td>26</td></tr></table>
preg_match_all($p, $str, $matches);
print_r($matches);? //Array([0] => Array([0] => Eric25[1] => John26)[1] => Array([0] => Eric[1] => John)[2] => Array([0] => 25[1] => 26))
$matches結(jié)果排序?yàn)?matches[0]保存完整模式的所有匹配, $matches[1] 保存第一個(gè)子組的所有匹配,以此類推桨仿。
7.正則表達(dá)式的搜索和替換
正則表達(dá)式的搜索與替換在某些方面具有重要用途睛低,比如調(diào)整目標(biāo)字符串的格式,改變目標(biāo)字符串中匹配字符串的順序等服傍。
例如我們可以簡(jiǎn)單的調(diào)整字符串的日期格式:
$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //結(jié)果為:2014, April 15
其中${1}與$1的寫法是等效的钱雷,表示第一個(gè)匹配的字串,$2代表第二個(gè)匹配的吹零。
通過(guò)復(fù)雜的模式罩抗,我們可以更加精確的替換目標(biāo)字符串的內(nèi)容。
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 =');//\3等效于$3,\4等效于$4灿椅,依次類推
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27'); //結(jié)果為:$startDate = 5/27/1999
//詳細(xì)解釋下結(jié)果:(19|20)表示取19或者20中任意一個(gè)數(shù)字澄暮,(\d{2})表示兩個(gè)數(shù)字名段,(\d{1,2})表示1個(gè)或2個(gè)數(shù)字,(\d{1,2})表示1個(gè)或2個(gè)數(shù)字泣懊。^\s*{(\w+)\s*=}表示以任意空格開(kāi)頭的伸辟,并且包含在{}中的字符,并且以任意空格結(jié)尾的馍刮,最后有個(gè)=號(hào)的信夫。
用正則替換來(lái)去掉多余的空格與字符:
$str = 'one? ? two';
$str = preg_replace('/\s+/', ' ', $str);
echo $str; // 結(jié)果改變?yōu)?one two'
8.正則匹配常用案例
正則匹配常用在表單驗(yàn)證上,一些字段會(huì)有一定的格式要求卡啰,比如用戶名一般都要求必須是字母静稻、數(shù)字或下劃線組成,郵箱匈辱、電話等也都有自己的規(guī)則振湾,因此使用正則表達(dá)式可以很好的對(duì)這些字段進(jìn)行驗(yàn)證。
$user = array(
'name' => 'spark1985',
'email' => 'spark@imooc.com',
'mobile' => '13312345678'
);
//進(jìn)行一般性驗(yàn)證
if (empty($user)) {
die('用戶信息不能為空');
}
if (strlen($user['name']) < 6) {
die('用戶名長(zhǎng)度最少為6位');
}
//用戶名必須為字母亡脸、數(shù)字與下劃線
if (!preg_match('/^\w+$/i', $user['name'])) {
die('用戶名不合法');
}
//驗(yàn)證郵箱格式是否正確
if (!preg_match('/^[\w\.]+@\w+\.\w+$/i', $user['email'])) {
die('郵箱不合法');
}
//手機(jī)號(hào)必須為11位數(shù)字押搪,且為1開(kāi)頭
if (!preg_match('/^1\d{10}$/i', $user['mobile'])) {
die('手機(jī)號(hào)不合法');
}
echo '用戶信息驗(yàn)證成功';
分隔符后面可以使用模式修飾符,模式修飾符包括:i, m, s, x等浅碾,例如使用i修飾符可以忽略大小寫匹配:
分隔符后面可以使用模式修飾符大州,模式修飾符包括:i, m, s, x等,例如使用i修飾符可以忽略大小寫匹配:
分隔符后面可以使用模式修飾符垂谢,模式修飾符包括:i, m, s, x等厦画,例如使用i修飾符可以忽略大小寫匹配:
分隔符后面可以使用模式修飾符,模式修飾符包括
分隔符后面可以使用模式修飾符滥朱,模式修飾符包括
分隔符后面可以使用模式修飾符根暑,模式修飾符包括:i, m, s, x等,例如使用i修飾符可以忽略大小寫匹配:
分隔符后面可以使用模式修飾符徙邻,模式修飾符包括:i, m, s, x等购裙,例如使用i修飾符可以忽略大小寫匹配: