麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Regex > 正文

PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法

2020-03-16 21:11:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
看到標(biāo)題是“請(qǐng)教PHP 一個(gè)正則匹配的問(wèn)題”,又是正則表達(dá)式,好吧,看下,誰(shuí)讓俺比較喜歡鼓搗正則呢。下面開(kāi)始正題。
 
 
網(wǎng)友a(bǔ)iniaa的問(wèn)題是 

PHP代碼如下 
復(fù)制代碼代碼如下:

$words = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSRUVWXYZ!@#$%^&*()_+-=[]//,./{}|<>?'/"你好啊我們"; 
$otherStr=preg_replace("/[chr(128)-chr(256)]+/is"," ",$words); 
echo 'otherStr:',$otherStr; 

為什么打印的結(jié)果會(huì)是: 
otherStr: ! #$% & {}| ‘”你好啊我們 

麻煩問(wèn)下其中正則表達(dá)式 /[chr(128)-chr(256)]+/is 代表什么意思? 
如果/[chr(128)-chr(256)]+/is 指的是ascii碼在128到256的字符,為什么a-zA-Z這樣的字符也被替換掉了,他們的ascii碼是小于127的。 
最令人郁悶的是為什么ascii碼同在0-127區(qū)間”#”,”$”,”%”,”&”, “!”,” {“,”}”,”|”,” ‘”,”確沒(méi)有被替換掉???? 
更令人感覺(jué)神奇的是 如果把正則表達(dá)式修改為”/[chr(128)-chr(256)]+/s”的話,輸出的結(jié)果就變成了: otherStr: defg ijklmnopq stuvwxyz ! #$% & {}| ‘”你好啊我們 
只是把正則表達(dá)式中的符號(hào)‘i'給去掉,結(jié)果缺失這樣的。 完全的令我理解不了。 
不知各位 有何見(jiàn)解???? 
另附ascii 碼 對(duì)照表 
(這個(gè)ASCII碼表的圖我就不貼了) 

回帖中,有個(gè)網(wǎng)友說(shuō)沒(méi)解析chr(128)這些,并給出了新的解決方法。首先說(shuō)下此網(wǎng)友回答的是正確的,先不評(píng)論他是否“知其然,且知其所以然”,這位網(wǎng)友沒(méi)有給出錯(cuò)誤的原因。 

CFC4N來(lái)回答一下這位網(wǎng)友: 

PHP的正則的preg_match函數(shù)用的是PCRE正則引擎,這位網(wǎng)友的代碼中,PCRE引擎處理的正則表達(dá)式為【/[chr(128)-chr(256)]+/is】,后面的is是什么呢? 
在PHP的正則里,邊界字符后面的叫模式修飾符。它會(huì)告訴引擎如何解析,處理正則。其中i修飾符表示不區(qū)分大小寫。s表示“點(diǎn)號(hào)通配模式”,用來(lái)讓正則里的元字符點(diǎn)號(hào)【.】可以匹配換行符,這個(gè)修飾符僅對(duì)點(diǎn)號(hào)【.】起作用。在這位網(wǎng)友的問(wèn)題中,修飾符s并不起作用的。 

查找原因: 
我們?cè)趤?lái)分析一下這個(gè)網(wǎng)友寫的正則表達(dá)式【[chr(128)-chr(256)]+】,正則表達(dá)式的PCRE引擎是如何解釋這個(gè)正則的呢?首先,我們要知道,在正則表達(dá)式中,中括號(hào)【[]】表示字符組,字符組中除了連接符【-】只外,都不是元字符,也就是說(shuō),都是普通字符,當(dāng)然,如果連字符出現(xiàn)在第一個(gè),或者不是標(biāo)識(shí)兩個(gè)字符之間范圍的,都是普通的字符橫杠“-”罷了。這里的chr(128)只是標(biāo)識(shí)ASCII碼為128(確切的說(shuō),ASCII碼只是0-127個(gè),128到其他的,應(yīng)該不叫ASCII碼了。),但是在正則里,他仍然代表【c、h、r、(、1、2、8、)】(頓號(hào)不是,只是區(qū)分易讀的)這八個(gè)字符罷了。這個(gè)正則里的連接字符,是哪些范圍呢?很明顯,這里的連接字符的范圍是【)-c】,“)”ASCII碼為0×29,也就是十進(jìn)制的41;“c”的ASCII碼為0×63,也就是十進(jìn)制的99,那么,他這個(gè)連接字符的范圍就是ASCII 41(chr(41))到ASCII 99(chr(99))之間的字符。也就是說(shuō),這位網(wǎng)友的正則的范圍是【[hr)-c(]】,就是chr(41)到chr(99)外加hr這兩個(gè)字母和前面的“(”。 
網(wǎng)友第一次測(cè)試的時(shí)候,有修飾符i,意思就是說(shuō),不區(qū)分大小寫,那么在chr(41)到chr(99)之間的字符,以及這些字符如果有大小寫,則包括他們的大小寫都符合匹配。都會(huì)被替換成空。其第二次測(cè)試的時(shí)候,去掉了修飾符i,進(jìn)行了不區(qū)分大小寫的匹配,由于其范圍只到c,但突然,再除了小寫字母的“h”、“r”,所以,測(cè)試結(jié)果會(huì)多出“defgijklmnopqstuvwxyz”。所以,他的結(jié)果出現(xiàn)了這些差別。 
PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法
網(wǎng)友的表達(dá)式等同于如下圖所示 
PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法
解決辦法: 
錯(cuò)誤的原因找出來(lái)了,那么,解決的辦法呢? 
我們先來(lái)看看這位網(wǎng)友的需求,他的需求是將unicode(ASCII只是0-127位的,128之后的,應(yīng)該叫UNICODE碼)的chr(128)到chr(255)之間的字符匹配,替換為空罷了。正則表達(dá)式里,對(duì)十六進(jìn)制的字符匹配的表示方式有兩種,【/u】和【/x{}】,前者只能表示【/u】后面4位的十六進(jìn)制數(shù)值,而后者【/x{}】則可以表示任意多的十六進(jìn)制位數(shù)(寫在大括號(hào)中)。 
那么,這個(gè)正則表達(dá)式該如何寫???? 

網(wǎng)友的目的是chr(128)到chr(255),那么就是【[/u0080-/u00FF]】或者【[/x{0080}-/x{00FF}]】。 
其目的是匹配下圖中的紅框內(nèi)字符 

PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法

提醒一下,PHP里正則匹配unicode字符時(shí),需要使用u修飾符。 
根據(jù)網(wǎng)友需求,更改正則之后的PHP代碼如下: 
復(fù)制代碼代碼如下:

$words = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSRUVWXYZ!@#$%^&*()_+-=[]//,./{}|<>?'/"你好啊我們"; 
$otherStr=preg_replace("//[/x{0080}-/x{00FF}]+/iu"," ",$words); 
echo 'otherStr:',$otherStr; 

其運(yùn)行結(jié)果是仍然輸出那段字符串,為什么呢?因?yàn)槟男┳址疾辉赾hr(128)到chr(255)的范圍之內(nèi)。 
(測(cè)試時(shí),注意文件編碼為UTF-8) 
以上為鄙人愚見(jiàn),歡迎批評(píng)指正。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲欧美不卡视频 | 亚洲精品久久久久久下一站 | 中文字幕一区二区三区四区 | 精品国产91久久久久久浪潮蜜月 | 免费国产在线视频 | 色污视频在线观看 | 午夜精品久久久久久久99热浪潮 | 欧美亚州 | 一区二区精品在线 | 免费视频99 | 成人一级视频 | 久久影院国产精品 | 干少妇av | 在线看一区二区三区 | 久久精品99北条麻妃 | 久草热久 | 国产精品久久久久久久久粉嫩 | 成人福利视频在线观看 | 日韩视频一区二区在线观看 | 国产亚洲精品成人 | 国产精品久久久久无码av | 国产免费久久久久 | 久久久久久久久久一本门道91 | 久久久久北条麻妃免费看 | 免费午夜视频在线观看 | 国内免费视频成人精品 | 精品亚洲视频在线观看 | 欧美一级aa免费毛片 | 欧美精品网址 | 久久久久国产成人精品亚洲午夜 | 国产中出在线观看 | 99精品视频网站 | av在线久草 | 久国产精品视频 | 欧日韩在线 | 黄色一级毛片免费看 | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 蝌蚪久久窝 | 狠狠操天天射 | 高清av免费 | 国产超碰人人爽人人做人人爱 |