濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法

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

熱門標(biāo)簽:自己做的電銷機(jī)器人 上海銷售電銷機(jī)器人軟件 浙江營(yíng)銷外呼系統(tǒng)有哪些 惠安地圖標(biāo)注 山東外呼系統(tǒng)聯(lián)系方式 哈爾濱公司外呼系統(tǒng)代理 淄博市張店區(qū)地圖標(biāo)注 遼寧秒客來電話機(jī)器人 地圖標(biāo)注店鋪地圖標(biāo)注酒店
網(wǎng)友a(bǔ)iniaa的問題是

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

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

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

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

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

CFC4N來回答一下這位網(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)通配模式”,用來讓正則里的元字符點(diǎn)號(hào)【.】可以匹配換行符,這個(gè)修飾符僅對(duì)點(diǎn)號(hào)【.】起作用。在這位網(wǎng)友的問題中,修飾符s并不起作用的。

查找原因:
我們?cè)趤矸治鲆幌逻@個(gè)網(wǎng)友寫的正則表達(dá)式【[chr(128)-chr(256)]+】,正則表達(dá)式的PCRE引擎是如何解釋這個(gè)正則的呢?首先,我們要知道,在正則表達(dá)式中,中括號(hào)【[]】表示字符組,字符組中除了連接符【-】只外,都不是元字符,也就是說,都是普通字符,當(dāng)然,如果連字符出現(xiàn)在第一個(gè),或者不是標(biāo)識(shí)兩個(gè)字符之間范圍的,都是普通的字符橫杠“-”罷了。這里的chr(128)只是標(biāo)識(shí)ASCII碼為128(確切的說,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))之間的字符。也就是說,這位網(wǎng)友的正則的范圍是【[hr)-c(]】,就是chr(41)到chr(99)外加hr這兩個(gè)字母和前面的“(”。
網(wǎng)友第一次測(cè)試的時(shí)候,有修飾符i,意思就是說,不區(qū)分大小寫,那么在chr(41)到chr(99)之間的字符,以及這些字符如果有大小寫,則包括他們的大小寫都符合匹配。都會(huì)被替換成空。其第二次測(cè)試的時(shí)候,去掉了修飾符i,進(jìn)行了不區(qū)分大小寫的匹配,由于其范圍只到c,但突然,再除了小寫字母的“h”、“r”,所以,測(cè)試結(jié)果會(huì)多出“defgijklmnopqstuvwxyz”。所以,他的結(jié)果出現(xiàn)了這些差別。

網(wǎng)友的表達(dá)式等同于如下圖所示

解決辦法:
錯(cuò)誤的原因找出來了,那么,解決的辦法呢?
我們先來看看這位網(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里正則匹配unicode字符時(shí),需要使用u修飾符。
根據(jù)網(wǎng)友需求,更改正則之后的PHP代碼如下:
復(fù)制代碼 代碼如下:

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

其運(yùn)行結(jié)果是仍然輸出那段字符串,為什么呢?因?yàn)槟男┳址疾辉赾hr(128)到chr(255)的范圍之內(nèi)。
(測(cè)試時(shí),注意文件編碼為UTF-8)
以上為鄙人愚見,歡迎批評(píng)指正。
您可能感興趣的文章:
  • php中最簡(jiǎn)單的字符串匹配算法
  • 正則匹配密碼只能是數(shù)字和字母組合字符串功能【php與js實(shí)現(xiàn)】
  • PHP使用數(shù)組依次替換字符串中匹配項(xiàng)
  • PHP的preg_match匹配字符串長(zhǎng)度問題解決方法
  • PHP中preg_match函數(shù)正則匹配的字符串長(zhǎng)度問題
  • PHP實(shí)現(xiàn)字符串翻轉(zhuǎn)功能的方法【遞歸與循環(huán)算法】
  • PHP中strnatcmp()函數(shù)“自然排序算法”進(jìn)行字符串比較用法分析(對(duì)比strcmp函數(shù))
  • php匹配字符中鏈接地址的方法
  • 基于PHP實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)和括號(hào)匹配算法示例
  • PHP實(shí)現(xiàn)的字符串匹配算法示例【sunday算法】

標(biāo)簽:西安 宣城 綿陽(yáng) 重慶 泰州 長(zhǎng)沙 無錫 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法》,本文關(guān)鍵詞  PHP,中,正則,表達(dá)式,對(duì),UNICODE,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    施甸县| 麟游县| 察隅县| 二连浩特市| 云浮市| 宜章县| 民权县| 浮梁县| 鹤壁市| 合水县| 南昌市| 玉屏| 井冈山市| 来宾市| 马山县| 历史| 二手房| 栖霞市| 壤塘县| 花莲县| 夏津县| 三台县| 西盟| 齐齐哈尔市| 贵南县| 开江县| 武隆县| 云霄县| 新巴尔虎右旗| 镶黄旗| 视频| 高要市| 景德镇市| 临泽县| 乐平市| 南丹县| 贵溪市| 黄陵县| 余姚市| 宜良县| 娄烦县|