手机版

PHP中UNICODE字符代码与正则表达式的匹配方法

时间:2021-10-20 来源:互联网 编辑:宝哥软件园 浏览:

ainiaa的问题是PHP代码复制如下: $ words=' 0123456789 abcdefghijklmnopqrstuwx[email protected]# $ % *()_-=[]\ \,/{} |?'你好,我们;$ other str=preg _ replace('/[chr(128)-chr(256)]/is ',' ',$ words);echo 'otherStr: ',$ otherStr为什么打印出来的结果是:otherStr:# $% {} | '“大家好,我们来问一下正则表达式/[chr(128)-chr(256)]/是代表什么?如果/[chr(128)-chr(256)]/是指ascii码在128到256之间的字符,为什么像a-zA-Z这样的字符被替换了,它们的ascii码小于127?最郁闷的是为什么ascii码在0-127的范围内“#”、“$”、“%”、“”、“!”。“{”、“}”、“|”、“'”、“还没有被替换?更神奇的是,如果将正则表达式修改为“/[chr(128)-chr(256)] /s”,输出结果将变成:other str : defg ijklmnopq stu vwxyz!# $% {} | '“您好,我们刚刚从正则表达式中删除了符号‘I’,结果丢失了。我不能完全理解。我想知道你的意见是什么。在附ascii码对照表的回复中(我就不贴ASCII码对照表的图片了),有网友说chr(128)没有解析,给出了新的解决方案。首先假设这位网友的回答是正确的,不评论他是否“知道为什么,并且知道为什么”。这位网友没有给出错误的理由。CFC4N来回答这位网友:PHP的正则preg_match函数使用了PCRE正则引擎。在这位网友的代码中,PCRE引擎处理的正则表达式是[/[chr(128)-chr(256)] /is]。以下是什么?在PHP正则化中,边界字符被称为模式修饰符。它告诉引擎如何解析和处理规律性。其中I修饰语表示不区分大小写。s代表“点匹配模式”,用于制作元字符点[。]在与换行符的常规匹配中,此修饰符仅在点[].在这位网友的问题中,修饰语s不起作用。搜索原因:我们正在分析这位网友写的正则表达式[[chr(128)-chr(256)]。正则表达式的PCRE引擎如何解释这种规律性?首先我们要知道在正则表达式中,括号[[]]代表的是字符组,除了connector [-]之外,都不是元字符,也就是说都是普通字符。当然,如果连字符先出现,或者没有标识两个字符之间的范围,那只是一个普通的字符条“-”。Chr(128)这里只标识ASCII码为128(准确的说,只有0-127个ASCII码,128到其他的码不应该叫ASCII码。),但在正则中,他还是代表了八个字符[c,h,r,(,1,2,8,](停顿不是,只是区分易读)。这个规则中的连接字符有哪些范围?显然,这里连接字符的范围是[) -c],而“)”的ASCII码是029,十进制是41;“c”的ASCII码是063,也就是十进制的99,所以“c”的连接字符范围是从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的chr(128)到chr(255)的字符进行匹配(ASCII只有0-127位,128之后应该叫UNICODE),用空字符替换。在正则表达式中,有两种方式来表示十六进制字符匹配,[\u]和[\x{}]。前者只能表示[\u]最后四位的十六进制值,而后者[\x{}]可以表示任意数量的十六进制数字(用大括号写)。那么,这个正则表达式怎么写呢?网友的目的是chr(128)到chr(255),所以是[[\u0080-\u00FF]]或者[\ u 0080 }-\ u 00FF]]。目的是匹配下图中红色方框中的字符。

提醒一下,在PHP中定期匹配unicode字符时,需要使用U修饰符。根据网友需求,修改后的PHP代码如下:复制代码如下: $ words='[email protected]# $ % *()_-=[]\ \,/{} |?'你好,我们;$ other str=preg _ replace('//[\ x { 0080 }-\ x { 00FF }]/iu ',' ',$ words);echo 'otherStr: ',$ otherStr因此,字符串仍然被输出。为什么呢?因为没有一个字符串在chr(128)到chr(255)的范围内。(测试时,注意文件编码为UTF-8。)以上是我的拙见。请批评指正。

版权声明:PHP中UNICODE字符代码与正则表达式的匹配方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。