亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

PHP中正則表達式對UNICODE字符碼的匹配方法

2020-03-16 21:11:47
字體:
來源:轉載
供稿:網友
看到標題是“請教PHP 一個正則匹配的問題”,又是正則表達式,好吧,看下,誰讓俺比較喜歡鼓搗正則呢。下面開始正題。
 
 
網友ainiaa的問題是 

PHP代碼如下 
復制代碼代碼如下:

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

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

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

回帖中,有個網友說沒解析chr(128)這些,并給出了新的解決方法。首先說下此網友回答的是正確的,先不評論他是否“知其然,且知其所以然”,這位網友沒有給出錯誤的原因。 

CFC4N來回答一下這位網友: 

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

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

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

PHP中正則表達式對UNICODE字符碼的匹配方法

提醒一下,PHP里正則匹配unicode字符時,需要使用u修飾符。 
根據網友需求,更改正則之后的PHP代碼如下: 
復制代碼代碼如下:

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

其運行結果是仍然輸出那段字符串,為什么呢?因為哪些字符串都不在chr(128)到chr(255)的范圍之內。 
(測試時,注意文件編碼為UTF-8) 
以上為鄙人愚見,歡迎批評指正。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线免费观看| 97婷婷大伊香蕉精品视频| 亚洲免费视频网站| 成人免费看片视频| 蜜臀久久99精品久久久久久宅男| 一本一本久久a久久精品综合小说| 亚洲a中文字幕| 一区二区三区动漫| 精品偷拍一区二区三区在线看| 国产精品老女人视频| 色狠狠av一区二区三区香蕉蜜桃| 久久精品国产一区二区三区| 日韩成人在线视频网站| 亚洲高清免费观看高清完整版| 91夜夜揉人人捏人人添红杏| 亚洲精品中文字幕av| 伊人青青综合网站| 日韩电影在线观看中文字幕| 日韩免费精品视频| 全亚洲最色的网站在线观看| 欧美洲成人男女午夜视频| 亚洲最大av网站| 日韩精品视频在线免费观看| 国产精品久久久久77777| 欧美成人免费小视频| 精品国产乱码久久久久久天美| 亚洲高清福利视频| 97人人爽人人喊人人模波多| 亚洲国产日韩欧美在线图片| 亚洲自拍欧美另类| 日韩av在线播放资源| 91九色综合久久| 精品久久久久久中文字幕一区奶水| 亚洲午夜未删减在线观看| 成人黄色av网站| 91超碰中文字幕久久精品| 亚洲美腿欧美激情另类| 最近2019中文免费高清视频观看www99| 久久久久久久久久久免费精品| 97香蕉久久夜色精品国产| 色妞色视频一区二区三区四区| 中文字幕日韩高清| 国产精品久久久av| 国产精品久久久久久久久久免费| 日韩免费在线免费观看| 欧美在线视频观看免费网站| 欧美一级在线亚洲天堂| 日韩av大片在线| 国产一区二区丝袜高跟鞋图片| 日韩精品免费在线视频| 欧美色视频日本高清在线观看| 这里只有视频精品| 国产精品精品一区二区三区午夜版| 欧美第一页在线| 中文字幕精品av| 精品中文字幕在线| 久久亚洲欧美日韩精品专区| 亚洲精品美女久久久久| 亚洲精品网址在线观看| 欧美精品制服第一页| 日韩女在线观看| 欧美日韩一区二区精品| 亚洲第一区第二区| 草民午夜欧美限制a级福利片| 国内免费久久久久久久久久久| 69av在线播放| 亚洲老头同性xxxxx| 国产大片精品免费永久看nba| 亚洲区一区二区| 91精品久久久久久久久不口人| 美女av一区二区三区| 国产成人一区二区三区| 国产精品xxx视频| 欧美精品一二区| 国内精品美女av在线播放| 亚洲97在线观看| 亚洲精品久久久久中文字幕二区| 欧美老妇交乱视频| 91社区国产高清| 国产aⅴ夜夜欢一区二区三区| 国产精品九九久久久久久久| 久久这里只有精品99| 国产亚洲精品一区二555| 26uuu另类亚洲欧美日本一| 精品亚洲国产视频| 欧美日韩国产精品一区二区三区四区| 精品无人国产偷自产在线| 精品色蜜蜜精品视频在线观看| 成人免费在线视频网址| 亚洲第一精品久久忘忧草社区| 午夜精品一区二区三区在线| 日本一区二区三区在线播放| 久久精品国产一区二区三区| 日韩欧美亚洲成人| 在线亚洲午夜片av大片| 中文字幕欧美日韩精品| 精品国产福利视频| 永久免费毛片在线播放不卡| 国产精品白丝av嫩草影院| 欧美第一淫aaasss性| 最近日韩中文字幕中文| www.美女亚洲精品| 91亚洲精品视频| 久久久久久久成人| 日本久久中文字幕| 伊人精品在线观看| 97国产在线观看| 亚洲第一精品福利| 日韩电影中文字幕一区| 国产午夜精品免费一区二区三区| 国产男人精品视频| 亚洲永久在线观看| 欧美日韩精品在线播放| 日韩一区二区精品视频| 国产精品视频在线播放| 欧美激情综合亚洲一二区| 欧美xxxx做受欧美.88| 在线观看精品自拍私拍| 欧美日韩另类在线| 成人中文字幕在线观看| 欧美成年人在线观看| 国产精品一区二区久久久| 成人有码在线播放| 国产综合久久久久久| 成人a级免费视频| 亚洲视频在线观看免费| 日本道色综合久久影院| 成人精品一区二区三区电影免费| 久久亚洲精品成人| 国产ts人妖一区二区三区| 久久精品视频在线| 欧美成人精品不卡视频在线观看| 国产亚洲美女精品久久久| 欧美激情精品久久久久久久变态| 日韩精品极品毛片系列视频| 日韩av不卡在线| 日本国产欧美一区二区三区| 久热精品视频在线免费观看| 亚洲精品色婷婷福利天堂| 92看片淫黄大片欧美看国产片| 亚洲在线观看视频网站| 91性高湖久久久久久久久_久久99| 亚洲欧美中文字幕在线一区| 亚洲综合色激情五月| 久久99热这里只有精品国产| 亚洲福利在线视频| 欧美黑人xxxⅹ高潮交| 91精品久久久久久| 国产男人精品视频| 亚洲自拍偷拍区| 欧美电影在线免费观看网站| 国产伦精品一区二区三区精品视频| 成人精品久久久| 日韩欧美第一页| 欧美一区二区三区图| 欧美成人一二三| 国产成人高清激情视频在线观看| 亚洲三级免费看| 激情久久av一区av二区av三区| 日韩电影在线观看中文字幕| 神马国产精品影院av| 久久影视免费观看| 日韩在线免费高清视频| 亚洲成人在线网|