网友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("//[\x{0080}-\x{00FF}]+/iu"," ",$words);

echo 'otherStr:',$otherStr;

其运行结果是仍然输出那段字符串,为什么呢?因为哪些字符串都不在chr(128)到chr(255)的范围之内。

(测试时,注意文件编码为UTF-8)

以上为鄙人愚见,欢迎批评指正。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

php 正则匹配unicode,PHP中正则表达式对UNICODE字符码的匹配方法相关推荐

  1. Python中正则表达式对单个字符,多个字符,匹配边界等使用

    Regular Expression,正则表达式,又称正规表示式.正规表示法.正则表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或 ...

  2. mysql的正则书写规则_MySql中正则表达式的使用方法描述

    MySql中正则表达式的使用方法描述 更新时间:2008年07月30日 08:47:59   作者: 不知道原来mysql支持正则表达式(regex)是定义复杂查询的一个强有力的工具. 这里是一个简单 ...

  3. vue 怎么在字符串中指定位置插入字符_Vue数组变更方法

    Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新.这些被包裹过的方法包括: push() pop() shift() unshift() splice() sort() reve ...

  4. 正则数字/大小英文/中划线/下划线 (多种)匹配集

    1.中英文匹配 // 判断 尽量转换为字符串,原因:js最大安全数 /^[0-9]+$/.test(String(num)) 正则判断是否为正数/^[a-z]+$/ 仅支持英文小写/^[A-Za-z] ...

  5. mysql正则匹配大写字母_正则表达式,大写字母,怎么匹配?

    展开全部 正则表达式匹配大写字母的表达为/^[A-Z]+$/ 其他情况下的匹配表达式: 一.测试字符串 var str = 'Adobe InDesign.Microsoft Word 等对中文626 ...

  6. 正则匹配出字符串中两串固定字符区间的所有字符

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 效果:匹配两个字符串区间的字符串 代码: var dd=[];var str = 'is_img&qu ...

  7. mysql中length与char_length字符长度函数使用方法

    在mysql中length是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符了,与char_length是有一点区别,本文章重点介绍第一个函数. mysql里面的length函数是一个用来 ...

  8. 判断字符串中是否包含指定字符的N种方法对比

    方法一 var str ="abc"; if(str.indexOf("bc")!=-1){// !=-1含有 ==-1不含有 } 方法二 var str =& ...

  9. python中一个汉字是几个字符_Python中每次处理一个字符的5种方法

    目的 对字符串的每个字符进行处理,其实每个字符(Char)就是一个长度为1的字符串. 方法 1.使用内建函数list() 复制代码 代码如下: >>> A_string='Pytho ...

最新文章

  1. 一个最简单的通过WireShark破解SSL加密网络数据包的方法
  2. hive工作记录-20180513
  3. Java获取当前时间前几个月、季度
  4. ble之gatt server
  5. Go——从文件路径解析解析GAVC坐标解决方案
  6. 微信小程序 条形加载读取进度 切换音频进度。简单实现(自定义音频界面实现)
  7. 关于SQLContext过期,SparkSession登场
  8. Java基础实战Bank项目01-04
  9. C语言中输入输出格式控制
  10. python爬取数据需要注意的问题
  11. HDU 1754 I Hate It(线段树版)
  12. mysql语句怎么替换_mysql怎么批量替换sql语句
  13. 精通git中文版 (连载四)
  14. Jensen不等式证明
  15. VS2010 移除源文件又增加源文件,无法编译问题
  16. 读《不能承受的生命之轻》 的思考
  17. hiveSQL面试题16__时间序列--构造日期
  18. php网站整合ck播放器,wordpress整合ckplayer最新版 wp文章短代码调用ck播放器
  19. int型的取值范围是?
  20. 山东大学 英文版《软件工程》教学内容回顾

热门文章

  1. 检查mysql的replication_MySQL Replication需要注意的问题
  2. 基于python的个人博客系统的设计开题报告_个人博客设计实现开题报告
  3. extensions.conf的常用参数配置
  4. Asterisk权威指南/第二章 Asterisk架构
  5. WinCE系统的编译过程详解
  6. python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮
  7. matlab武汉理工大学数值分析线性函数拟合实验_「首席架构师推荐」数值计算库精选...
  8. Linux绘图函数与驱动,Linux中与驱动相关的ioctl函数
  9. 【转】为什么博士叫PhD?
  10. 【Python CheckiO 题解】Time Converter (12h to 24h)