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

网友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”。所以,他的结果出现了这些差别。

c5a42baaba92f43106e2dd2526e78c7c.png

网友的表达式等同于如下图所示

019a0bfb4bf3d5ca7e7407c5ad4688df.png

解决办法:

错误的原因找出来了,那么,解决的办法呢?

我们先来看看这位网友的需求,他的需求是将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}]】。

其目的是匹配下图中的红框内字符

477531df9deba5762335cc1014113dff.png

提醒一下,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中文网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis7怎么安装php7,Linux下如何安装php7

Linux下安装php7的方法&#xff1a;首先安装依赖包&#xff0c;并下载解压安装包&#xff1b;然后检查环境的依赖关系&#xff0c;并编译安装&#xff1b;接着将【php.ini-production】改名为【php.ini】&#xff1b;最后复制启动脚本&#xff0c;并启动PHP即可。Linux下安装ph…

php长轮询阻塞,ajax长轮询时php被阻塞

刚接触实时通讯这块&#xff0c;知道用websocket更高效&#xff0c;但我想了解轮询的实现过程&#xff0c;循序渐进短轮询用定时器setInterval已经实现了&#xff0c;但长轮询时后台进入死循环模块导致整个网站的php网页无响应&#xff0c;比如刷新页面、提交消息都没法进行。具…

php隐藏路径ngnix,thinkphp框架在nginx环境下去掉index.php路径显示

协助用户将apache下的一个网站迁移到nginx环境中&#xff0c;结果发现用户用的ThinkPHP框架做的开发&#xff0c;默认用的pathinfo。这是一个很头疼的问题&#xff0c;因为nginx不支持pathinfo&#xff0c;贸然一并打开也担心不安全。于是查询资料后整理如下&#xff1a;找到ap…

php curl 数据采集 空,PHP curl从网站返回空数组的数据

我想写一个PHP脚本来从www.snowbird.com/mountain-report/拉雪和其他数据通过LED阵列显示。我在获取需要的数据方面遇到麻烦。我似乎无法找到使其工作的方法。我能做这项工作吗&#xff1f;还是我需要去使用另一种语言&#xff1f;PHP curl从网站返回空数组的数据以下代码仅返回…

flux react php,Vue的Flux框架之Vuex状态管理器

学习vue之前&#xff0c;最重要是弄懂两个概念&#xff0c;一是“what”&#xff0c;要理解vuex是什么&#xff1b;二是“why”,要清楚为什么要用vuex。Vuex是什么&#xff1f;Vuex 类似 React 里面的 Redux 的状态管理器&#xff0c;用来管理Vue的所有组件状态。为什么使用Vue…

php config(),php config

PHP 的安装由于php是一个zip文件(非install版)&#xff0c;安装较为基本解压就行。把解压的 php5.2.1-Win32重命名为 php5。并复制到安装盘目录下。例如安装路径为 c:\php51 找到php目录下的 php.ini-dist或 php.ini.recommended文件&#xff0c;重命名为 php.ini,并复制到系统…

functions.php 在哪,functions.php常用函数

在设计WordPress主题时&#xff0c;在functions.php文件里添加一套通用的自定义函数将会大大提高开发效率&#xff0c;这样就不必每次开发主题时都需先查找然后复制同样的函数。这里记录一些常用的函数&#xff0c;方便以后使用&#xff01;给头部添加feed链接WordPress2.8以后…

java基本数据类型存储,JAVA - 基本数据类型的存储空间长度

1.整型类型 存储需求 bit数 取值范围 备注byte 1字节 1*8 &#xff0d;128&#xff5e;127short 2字节 2*8 &#xff0d;32768&#xff5e;32767int 4字节 4*8 (-2的31次方到2的31次方-1)long 8字节 8*8 (-2的63次方到2的63次方-1) 长整型数值后缀为LJAVA 没有无符号类型JAVA中…

matlab回调函数,matlabGUI回调函数介绍.pptx

matlabGUI回调函数介绍GUI开发环境的常用工具与回调函数和GUI程序文件GUI开发常用工具1、控件面板2、对象对齐工具3、对象浏览器4、tab顺序编辑器5、属性编辑器6、菜单编辑器7、M文件编辑器回调函数回调函数是控件接收到用户的操作时调用的特定函数&#xff0c;每个回调函数都是…

余额交易查询 php,深圳通余额查询的API

深圳通余额查询的API&#xff0c;可以通过深圳通号码查询到余额及卡有效期等信息。 用到Domxpath和Curl两方面的知识。 源码已托管到github&#xff0c;另外要加载个类&#xff1a;myclass 项目地址&#xff1a;https://github.com/skiy/dev 演示&#xff1a;http://api.oupag.…

食饵捕食者模matlab,几类食饵-捕食者模型的定性分析和数值模拟

摘要&#xff1a;生态问题一直是人们普遍关注的问题,特别是生态问题中的食饵-捕食者模型,则处于举足轻重的位置。如何更有效的控制、调节生物种群,使之保持良性发展,则具有非常重要的生态意义和应用价值。解决这类问题的主要工具是种群动力学模型,解决的依据是数学的理论和方法…

数组填充php,php数组入门教程之数组填充

本文介绍下&#xff0c;有关php数组之数组填充的一个例子&#xff0c;有需要的朋友参考下。在php编程中&#xff0c;对数组元素进行填充&#xff0c;可以使用array_fill()函数。来看下面的例子&#xff0c;array_fill()函数——填充数组函数&#xff1a;";print_r ($array…

php在类定义一个我静态变量,php中静态类与静态变量用法的区别分析_PHP教程

php中静态类与静态变量用法的区别分析static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了.1. 创建对象$object new Class()&#xff0c;然后使用”->”调用&#xff1a;$object->attribute/function&…

matlab 排序点,matlab如何进行排序?

来自SORT的MATLAB文档&#xff1a;If A has complex entries r and s,sort orders them according to thefollowing rule: r appears before s insort(A) if either of the followinghold:abs(r) < abs(s)abs(r) abs(s) and angle(r) < angle(s)换言之&#xff0c;具有复…

matlab不同调制方式下性能比较,用不同调制方式实现跳/扩频混合通信的抗干扰性能...

论文写作指导&#xff1a;请加QQ229366758摘要&#xff1a;介绍了BPSK&#xff0c;QPSK&#xff0c;16PSK&#xff0c;FSK&#xff0c;MSK及GMSK 6种数字调制方式的特点&#xff0c;采用Matlab中的Simulink建立了各种调制方式实现DS/FH混合扩频系统的仿真模型。重点研究了跳/扩…

matlab cd参数,MATLAB变量参数列表​

默认值default value对于用户没有传递参数值时给函数进行自动赋给该参数的值​比如上述的例子中&#xff0c;阻尼系数&#xff0c;用户通常不清楚&#xff0c;可以由系统给出更为合适。怎么做到呢&#xff1f;​可以结合MATLAB的一个函数nargin&#xff0c;它能给出函数输入参数…

java 旋转方向,Java 2d方向鼠标点旋转

使用Graphics2D旋转方法确实是最简单的方法.这是一个简单的实现&#xff1a;int centerX width / 2;int centerY height / 2;double angle Math.atan2(centerY - mouseY, centerX - mouseX) - Math.PI / 2;((Graphics2D)g).rotate(angle, centerX, centerY);g.fillRect(...)…

基于matlab 的燃油喷雾图像处理方法,基于MATLAB的燃油喷雾图像处理方法.doc

基于MATLAB的燃油喷雾图像处理方法基于MATLAB的燃油喷雾图像处理方法摘要:提出了基于MATLAB的燃油喷雾图像处理方法。通过对喷雾图像的采集, 分割和滤波处理, 将多幅图像转换融合为一幅比较清楚的二值图像, 对拍摄的喷雾图像进行了去噪及二值化等初步处理, 并提取其轮廓图, 求取…

matlab声音信号时域频域转换,关于处理用采集卡采集到的声音时域信号转化成频域信号........

求助各位大神&#xff0c;我用麦克风通过采集卡采集到了一段声音数据&#xff0c;数据在附件里&#xff0c;矩阵中第一列为时间&#xff0c;第二列为采集到的声音的电压信号&#xff0c;采样频率为1万Hz&#xff0c;做出时域图和频域图的程序如下所示&#xff1a;clear;clc;loa…

win7和mysql乱码,windows本地mysql数据库存入中文乱码

windows本地mysql数据库存入中文乱码作者:PHPYuan 时间:2018-07-23 03:41:20出现的问题&#xff1a; 我这页面存中文到数据库会乱码 我打了断点 中文是传到后台dao层的 然后我试了下 把我本地项目连服务器数据库 保存不会乱码 我就怀疑是本地数据库有问题 然后我用navicat写了个…