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

首頁 > 編程 > regex > 正文

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

2020-01-20 22:17:10
字體:
來源:轉載
供稿:網友
網友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”。所以,他的結果出現了這些差別。

網友的表達式等同于如下圖所示

解決辦法:
錯誤的原因找出來了,那么,解決的辦法呢?
我們先來看看這位網友的需求,他的需求是將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字符時,需要使用u修飾符。
根據網友需求,更改正則之后的PHP代碼如下:
復制代碼 代碼如下:

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

其運行結果是仍然輸出那段字符串,為什么呢?因為哪些字符串都不在chr(128)到chr(255)的范圍之內。
(測試時,注意文件編碼為UTF-8)
以上為鄙人愚見,歡迎批評指正。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情亚洲综合一区| 欧美多人乱p欧美4p久久| 久久久视频在线| 97在线日本国产| 国产精品免费久久久久久| 5252色成人免费视频| 国产亚洲欧洲高清| 疯狂欧美牲乱大交777| 97在线日本国产| www.欧美精品一二三区| 国产69精品久久久久99| 国产97在线观看| 伊人一区二区三区久久精品| 亚洲区中文字幕| 亚洲午夜小视频| 久久久久久久999精品视频| 亚洲激情小视频| 亚洲美女免费精品视频在线观看| 亚洲欧洲国产精品| 亚洲人成在线播放| 亚洲国产精品推荐| 日韩经典中文字幕在线观看| 亚洲人免费视频| 亚洲成色www8888| 亚洲人成在线免费观看| 国产97色在线|日韩| 国产xxx69麻豆国语对白| 欧美诱惑福利视频| 欧美猛男性生活免费| 国产精品h在线观看| 国产精品久久久久av免费| 日韩精品免费观看| 日韩在线观看成人| 精品久久久久久中文字幕一区奶水| 国产精品高清网站| 欧美成人免费一级人片100| 亚洲国产精品va在线观看黑人| 欧美亚洲第一区| 欧美激情欧美狂野欧美精品| 久久精品久久久久电影| 日韩av在线网址| 日韩经典中文字幕在线观看| 91中文字幕在线观看| 一区二区三区无码高清视频| 欧美精品激情blacked18| 亚洲免费电影一区| 欧美国产日韩免费| 欧美日韩人人澡狠狠躁视频| 成人深夜直播免费观看| 日韩精品在线免费观看视频| 国产精品一区二区电影| 亚洲第一精品自拍| 日韩电影免费观看在线| 精品国产依人香蕉在线精品| 欧美最猛性xxxxx免费| 中文字幕国内精品| 国产成人久久精品| 欧美日韩视频在线| 欧美一区亚洲一区| 91免费的视频在线播放| 国产精品v片在线观看不卡| 久久久国产一区二区| 久久影院免费观看| 一道本无吗dⅴd在线播放一区| 2020国产精品视频| 中文字幕亚洲综合久久筱田步美| 国产综合视频在线观看| 青草青草久热精品视频在线观看| 亚洲欧洲在线播放| 日本国产欧美一区二区三区| 亚洲毛片在线看| 欧美精品在线免费观看| 国产午夜精品视频免费不卡69堂| 日本高清视频一区| 日韩av男人的天堂| 日本精品视频在线观看| 中文精品99久久国产香蕉| 成人免费看黄网站| 精品国产欧美成人夜夜嗨| 91在线高清免费观看| 中文字幕国产亚洲| 亚洲图片制服诱惑| 久久久久久这里只有精品| 欧美www在线| 国产精品r级在线| 欧美情侣性视频| 国产精品久久久久久久一区探花| 欧美一级视频免费在线观看| 伊人久久男人天堂| 91久久精品在线| 日本韩国欧美精品大片卡二| 亚洲第一区第二区| 成人有码在线播放| 69久久夜色精品国产69乱青草| 亚洲护士老师的毛茸茸最新章节| 国产精品99一区| 欧美成人h版在线观看| 日韩国产欧美精品一区二区三区| 中文字幕日韩专区| 国产91色在线免费| 欧美在线视频免费观看| 两个人的视频www国产精品| 日韩欧美极品在线观看| 精品久久久在线观看| 在线日韩中文字幕| 91高清视频在线免费观看| 国产一区二区三区视频在线观看| 欧美激情精品久久久久| 中文字幕av一区中文字幕天堂| 日韩极品精品视频免费观看| 一区二区三区视频免费| 伊是香蕉大人久久| 亚洲成人av中文字幕| 51久久精品夜色国产麻豆| 97精品一区二区三区| 国产精品久久中文| 久久资源免费视频| 亚洲精品美女在线观看| 在线播放日韩精品| 亚洲人成在线播放| 日韩一区视频在线| 亚洲人成电影在线观看天堂色| 国产精品视频在线观看| 久久天天躁夜夜躁狠狠躁2022| 性色av一区二区咪爱| 久久色精品视频| 国产成人精品久久二区二区| 97国产精品视频人人做人人爱| 在线日韩日本国产亚洲| 自拍偷拍亚洲欧美| 97视频人免费观看| 国产成人在线视频| 国产精品久久久久不卡| 中文国产成人精品| 国产suv精品一区二区三区88区| 欧美久久精品午夜青青大伊人| 亚洲免费视频在线观看| 色婷婷综合久久久久| www日韩欧美| 日韩av大片免费看| 一区二区三区无码高清视频| 国产精品久久久久久久久久99| 国产精品av网站| 超碰精品一区二区三区乱码| 日韩精品免费在线观看| 成人激情视频在线播放| 日韩av中文字幕在线| 九九热精品在线| 色偷偷91综合久久噜噜| 亚洲最大的成人网| 亚洲一区二区福利| 性欧美xxxx视频在线观看| 精品一区电影国产| 国产午夜精品全部视频在线播放| 中文字幕无线精品亚洲乱码一区| 日韩精品福利在线| 欧美性高潮在线| 97国产精品视频| 日本三级久久久| 91在线直播亚洲| 91中文在线观看| 欧美不卡视频一区发布| 亚洲欧美国产视频| 精品福利在线视频|