- PHP的中文文字處理技巧 推薦度:
- 相關(guān)推薦
PHP中文文字處理技巧
在處理中文字符串的時(shí)候,如何處理?以下就是小編精心推薦PHP中文文字處理技巧,希望對大家有幫助!
我們都知道,在PHP中處理字符串,可以用substr,str_split等等眾多的方法,但是我想每個(gè)人都遇到過一個(gè)問題,那就是如何完美的處理中文字符串!我們知道,中文與英文和數(shù)字完全不同,英文和數(shù)字通常情況下都僅僅是占用一個(gè)字節(jié),但是中文在不同編碼下占用的字節(jié)是不同的,在UTF8中占用3個(gè)字節(jié),而在GBK中則占用2字節(jié)。
一、字符串逐字分割
即使我們確定使用的編碼格式,例如我們最常用的UTF8編碼,知道漢字是占用3字節(jié),那么對于中英文混排,依然會比較頭疼,因?yàn)閟ubstr,str_split等方法都是依照字節(jié)分割的,例如我們想要逐字分割字符串,或是以一定長度分割字符串,這個(gè)問題就會變得復(fù)雜,如果我們以3為倍數(shù)分割,除非我們保證字符串是純粹的中文,否則結(jié)果依然有很大幾率將中文“切碎”,當(dāng)然如果你去網(wǎng)上搜索,可能會有人告訴你,可以用mb_substr(),但是你不得不注意一點(diǎn),mb并不是PHP本身預(yù)裝的,可能有些集成環(huán)境帶有這個(gè),但同樣的,也有很多PHP不會帶有這些mb開頭的方法。例如我的服務(wù)器就沒有mb開頭的這些方法。
而在網(wǎng)上你能找到的還有利用循環(huán)遍歷的方法去判斷字符的編碼,以及是否是漢字,然后再逐個(gè)用substr分割,雖然這個(gè)方法可以不借助mb這類額外的東西,但是實(shí)現(xiàn)起來實(shí)在過于麻煩,實(shí)際上只要你用的PHP不是太舊,我們只需要一步就能輕松的做到字符串的逐字分割。
我們需要借助的是一種對于字符串處理十分擅長,但很多人認(rèn)為是比較高級的東西——正則表達(dá)式?赡苡行┤颂岬秸齽t表達(dá)式,會比較反感,其實(shí)我個(gè)人最開始也感覺正則表達(dá)式比較復(fù)雜,因?yàn)槔锩嬗昧烁鞣N“標(biāo)點(diǎn)符號”來標(biāo)記各種功能。但當(dāng)你發(fā)現(xiàn)它的強(qiáng)大之后,你真的會愛上它。
我們只需要使用preg_match_all("/./u",$str,$arr);就可以得到一個(gè)名為$arr的字符數(shù)組,也就是我們需要的逐字分割的結(jié)果。沒錯,僅僅是這樣簡短的一行代碼,就達(dá)到了逐字分割字符串的目的,是不是很簡單呢?其實(shí)原理也很簡單。
我們首先說一下preg_match和preg_match_all這兩個(gè)方法,這兩個(gè)方法是PHP內(nèi)置的,專門用來匹配正則的方法,所以不用擔(dān)心你的PHP環(huán)境不支持它們。preg_match是僅匹配一次,我們通常用來提取某一個(gè)字符串中的一個(gè)內(nèi)容,當(dāng)它找到第一個(gè)符合的結(jié)果時(shí),便會直接將結(jié)果返回給變量,并且停止匹配,而preg_match_all則是匹配所有符合的結(jié)果,他會將你傳給他的字符串反復(fù)匹配,找到所有匹配的結(jié)果。
然后就是我們使用的正則表達(dá)式,“/./u”十分的簡單,正則表達(dá)式以斜線開始和結(jié)束,而在結(jié)束的斜線后面則可以設(shè)置屬性,常用的有i,u,g等,這里我們使用的u十分的重要,因?yàn)檫@里的u代表將字符串以UTF8編碼格式來處理,如果沒有這個(gè),我們就不能正常的處理中文字符。而“.”則是代表任意字符,因此這里我們只是匹配一個(gè)UTF8的字符,而因?yàn)槲覀兪褂昧藀reg_match_all所以我們就可以得到所有的單個(gè)字符,也就達(dá)到了逐字分割的目的。
二、中文字符串長度
在獲取中文字符串長度的時(shí)候,也會遇到問題,我們使用str_len獲取的字符串長度也是不正常的,那么想要獲取含有中文的字符串的字符個(gè)數(shù)該怎么辦呢?其實(shí)非常的簡單,我們依然使用preg_match_all("/./u",$str,$arr);就可以了,只不過我們要拿到的不是$arr,而是preg_match_all的返回值,也就是$len=preg_match_all("/./u",$str,$arr);我們拿到的$len就是字符串的長度,這也是我為什么建議使用preg_match_all逐字分割字符串,而不是用preg_split,因?yàn)槲覀冇胮reg_match_all可以一步同時(shí)獲取數(shù)組和字符串長度。
需要注意的是,還有一些文章中使用了explode("",$str);來逐字分割字符串,但是這種做法是不正確的,explode的第一個(gè)參數(shù)不可以為空!
三、以字符串分割或組合字符串
接下來我們簡單了解一下其他兩個(gè)最常用的方法,他們可以說是一對好兄弟,那就是explode和implode,長的都很像,但是功能卻剛好是相反的。在我們處理一些字符串的時(shí)候,很經(jīng)常用到這兩個(gè)方法。
explode是用來以字符串分割字符串的方法,我們得到的是一個(gè)數(shù)組,并且這個(gè)數(shù)組不包含分隔符,例如我們有一個(gè)字符串是 “15912345678/18899995464”兩個(gè)電話號,我們想要將其分開,怎么辦呢?只需要用explode("/","15912345678/18899995464");就可以得到一個(gè)Array([0]=>"15912345678",[1]=>"18899995464")的數(shù)組,這種情況我們一般用于多個(gè)結(jié)果,例如多個(gè)電話,多個(gè)姓名等,我們使用explode分割后就可以遍歷處理。
implode的作用剛好相反,是以字符串為分隔符將數(shù)組組合成一個(gè)字符串,例如我們要將一個(gè)數(shù)組的數(shù)據(jù)用逗號分割,implode(",",$arr);我們得到的就是“1,2,3,4”這樣的字符串。
我們在部分時(shí)候,處理一些數(shù)量不確定的數(shù)據(jù)的時(shí)候,往往會將這些內(nèi)容作為一個(gè)字符串保存在數(shù)據(jù)庫的一個(gè)字段中,而我們使用的時(shí)候就需要用explode分割開進(jìn)行處理。例如個(gè)人資料,我們在填寫的時(shí)候,往往允許添加多個(gè)工作經(jīng)歷,多個(gè)就讀學(xué)校,這些數(shù)據(jù)的條目數(shù)量不確定,我們可能就會將其作為一個(gè)字符串寫入到一個(gè)字段中。
在大部分語言中都存在這樣的方法,但是PHP的自由度更高一些,并不僅限于一個(gè)字符,你也可以使用字符串來分割或組合,例如implode("/!/",$arr);這種方式也是可以的,這樣其實(shí)十分有用,例如我們寫入SQL插入語句的VALUES的時(shí)候,我們知道,SQL插入語句的VALUES要求是('val1','val2','val3'……)這樣的格式,每一個(gè)值都要求使用單引號括起來,那么我們?nèi)绻恳粋(gè)值使用一個(gè)變量,逐個(gè)去寫,顯然比較麻煩,那么我們有沒有比較“偷懶”的方式呢?當(dāng)然有!
首先,你的表單順序和你插入的字段順序要一致,其次所有不需要寫入數(shù)據(jù)庫的控件不要給name屬性。這樣就可以保證一點(diǎn),$_POST數(shù)組得到的是剛好對應(yīng)數(shù)據(jù)庫字段的數(shù)據(jù)。接下來我們只要,$values="'".implode("','",$_POST)."'";就可以得到一個(gè)格式為'val1','val2',…… 這樣的字符串,最后只需要在VALUES的地方寫到 VELUES ($values)就可以一步完成插入的操作了。為了防止看不清上面那行代碼,我用文字?jǐn)⑹鲆幌掳,首先我們放兩個(gè)字符串,里面是單引號,即 雙引號 單引號 雙引號 這是開頭和結(jié)尾兩個(gè)字符串的部分,不要看成五個(gè)單引號。中間的部分則是拼接字符串,間隔符是 單引號 逗號 單引號 這個(gè)部分,而我們同樣需要把單引號括在雙引號里面。為什么前后還要加一個(gè)單引號呢?因?yàn)閕mplode的間隔符是加在值中間的,只用implode得到的剛好是 val1','val2','val3 因?yàn)?',' 是作為分割符,所以只在中間,因此第一個(gè)值前面,和最后一個(gè)值后面都會缺少一個(gè)單引號,所以我們需要加上。
字符串的逐字分割我們經(jīng)常會用到,尤其是當(dāng)你去制作模糊搜索的時(shí)候,這一點(diǎn)就顯得十分必要,但當(dāng)你去通過百度或是Google查找的時(shí)候,我發(fā)現(xiàn)很少有提到這種方法的,你學(xué)會了嘛?PHP正則的應(yīng)用我們之后也會繼續(xù)講到哦。
【PHP中文文字處理技巧】相關(guān)文章:
PHP的中文文字處理技巧03-06
4項(xiàng)PHP中文編碼技巧04-18
php截取指定長度中文字符的技巧07-16
解決PHP中文亂碼問題05-27
轉(zhuǎn)換中文日期的PHP程序04-01
PS文字處理方法技巧04-19
幾個(gè)php技巧04-20
PHP小技巧07-12
完美解決PHP中文亂碼問題07-18