详解PHP正则表达式中的转义操作

PHP正则表达式中的特殊字符和转义

在 PHP 正则表达式中,有许多特殊字符具有特定的意义。这些特殊字符通常用于定义匹配模式的一部分,或者改变匹配的行为。以下是 PHP 正则表达式中一些常用的特殊字符及其含义:

.匹配除换行符之外的任何单个字符
^在方括号内表示取反(即不匹配括号内的字符),在行首表示锚定到行的开始位置
$锚定到行的结束位置
*匹配前面的子表达式零次或多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式零次或一次
[] 匹配方括号内的任何一个字符,方括号内的字符可以是单个字符或字符范围,如 [a-z]
|选择运算符,匹配竖线左右两边的任意一个子表达式
()用于分组,可以用来定义捕获组或非捕获组
\用于转义后面跟着的一个特殊字符使其被视为普通字符,或者用于引用一些特殊的预定义字符类或模式

当我们需要匹配这些特殊字符本身而不是它们的特殊含义时,就需要使用转义字符"\"(反斜线)

 

反斜线有多种用法.如果紧接着是一个非字母数字字符,表明取消该字符所代表的特殊涵义

比如,如果希望匹配一个"*"字符的字面意思,就需要在模式中写为 "\*",表示匹配的是*星号本身,而不是它的特殊含义,如果要匹配 \ 反斜线本身,也需要一个转义符转义 也就是"\\"

 

同时反斜线在 PHP 字符串 中也有特殊含义,因此也需要反斜线 \进行转义,最后要写成 "\\\\"

因为php会先对字符串进行转义,\\\\ 第一个转义符\转义第二个\  第三个转义符\转义第四个\

转义结果为\\   然后正则表达式继续转义,第一个转义符依然转义第二个\  最后匹配的就是反斜线\本身

 

PHP字符串中的特殊字符和转义

PHP 字符串中也有一些字符有特殊的含义,例如转义符 \   换行\n  回车\r  单双引号 等等

对于这些特殊字符,如果希望php字符串使用其本身的字面含义而不是特殊含义,同样需要转义符\去转义

<?php
echo '\\\\';
echo '<br>';
echo "\\";
echo '<br>';
echo "\n";
echo '<br>';
echo "\\n";
echo '<br>';
echo "\"\"";

可以看到,无论是在双引号还是单引号中,PHP都会对字符串进行解析,对字符串中的特殊字符执行转义操作

4bdd72d4634740779b3591a1bcdb06f2.png

因此,在php正则表达式中的字符串会经过两次解析,即

php解析正则时会先对字符串进行解析,然后再对正则表达式进行解析

下面就探究一下PHP字符串和正则表达式的转义操作具体是如何执行的

以下面的例子来说:

<?php
highlight_file(__FILE__);
echo '<br>';
$id=$_GET['id'];if(preg_match("/hex|\-|\\|\*|\<|\>|\!|\+/",$id))echo "matched!";
elseecho "pass!";

"hex"在php正则表达式和字符串都只是一个普通的字符串,没有特殊含义所以不需要转义

看起来代码中使用preg_match正则函数去检查正则表达式中是否包含 hex + -  * \  < > !  等关键词

但是其实并不完全是,这里不会匹配 \ 和 * 字符,取而代之匹配的是  |*   这个字符,其他的字符是正常匹配的

5bc70249c4db4a1899196b448cba1f9c.png

a0d2474b3f354884b1e635a4f11fa022.png

1ce0d5a4ecb14aa88edb804b0fd1f716.png

解释:

php解析正则时会先对字符串进行解析,然后再对正则表达式进行解析

正则匹配字符串 "/hex|\-|\\|\*|\<|\>|\!|\+/"    里面的  + - * < > ! 等字符在php字符串中没有特殊意义,就是普通字符,所以字符串解析完还是带有转义符号

反斜线\ 在PHP字符串中也是特殊字符,匹配字面意思时需要转义 所以\\被php字符串解析成\

如下图所示

<?php
echo "hex|\-|\\|\*|\<|\>|\!|\+";

5d3e14a604264d92927e7fc9bada59bd.png


php字符串解析完为     hex|\-|\|\*|\<|\>|\!|\+
接着就是正则表达式解析, 正则表达式中 - + * ! < >  |等都是特殊字符,所以需要转义符进行转义操作  

字符串中的 \|\* 被转义之后成为 |*      结果就变成了 hex| - | |* | < | > | ! | +   这个格式 

因此上面的结果中输入|* 会被匹配,而单独输入 | 和 * 都不会匹配

 

修改代码:

<?php
highlight_file(__FILE__);
echo '<br>';
$id=$_GET['id'];if(preg_match("/hex|\-|\\\\|\*|\<|\>|\!|\+/",$id))echo "matched!";
elseecho "pass!";

在正则表达式中用 \\\\ 来表示匹配一个字面意思的反斜线\      用\\\ 也可以表示,\\\\更规范

这样正则表达式就会正常匹配 \ 和 * 以及其他字符

 

 

 

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

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

相关文章

练习LabVIEW第二十四题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十四题&#xff1a; 分别利用for循环的移位寄存功能和反馈节点两种方法求0510154550的值 开始编写&#xff1a; 两个…

PHP免杀详细讲解PHP免杀详细讲解

基础学习 可变参数 $_GET $_POST $_COOKIE $_REQUEST $_SERVER 其中的某些参数可控,如REQUESTMETHOD,QUERYSTRING,HTTPUSERAGENT等 session_id() 这个比较特殊,但是依然可以利用 $_FILE $GLOBALS getallheaders() get_defined_vars() get_defined_functions() fil…

晓羽扫码点餐快销版系统源码

扫码点餐系统&#xff08;快销版&#xff09;是一款专为快销类餐饮行业设计的点餐工具&#xff0c;如早餐店、面馆、快餐店及零食小吃摊等&#xff0c;旨在满足这些场景下快捷、高效的扫码点餐需求。其核心功能在于仅支持先付款后就餐的模式&#xff0c;这一设计大大简化了点餐…

cesium 加载本地json、GeoJson数据

GeoJSON是一种用于编码地理数据结构的格式 {"type": "Feature","geometry": {"type": "Point","coordinates": [125.6, 10.1]},"properties": {"name": "某地点"} } 一、直接加载…

软件测试学习笔记丨Selenium学习笔记:css定位

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22511 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

OpenHarmony4.0配置应用开机自启

一、开发环境 系统版本:OpenHarmony 4.0.10.13 设备平台:rk3588 SDK版本:fullSDK 4.0.10.13 二、背景 使用自研应用作为默认Launcher,或者说使特定应用默认开机自启作为Home应用。 三、分析过程 通过分析原生Launcher启动流程可知: AMS启动根据应用优先级启动应用,通…

leetcode 75-13 k和数对的最大数目

我的思路 sort函数排序 然后双指针判断 这样时间复杂度nlgn 题解给出了一种空间换时间方法 用哈希表 注意一下写法 现在完全不会这样写 还有就是注意sort函数的代码 怎么写排序也给忘了 sort用的是什么排序方法、 分析 自己写的代码和所谓的滑动窗口就是相当于简化了每个…

【04】RabbitMQ的集群机制

1、RabbitMQ的性能监控 关于RabbitMQ的性能监控&#xff0c;在管理控制台中提供了非常丰富的展示。例如&#xff1a;首页这个整体监控页面&#xff0c;就展示了非常多详细的信息&#xff1a; 还包括消息的生产消费频率、关键组件的使用情况等等非常多的消息。都可以在这个管理…

week08 zookeeper多种安装与pandas数据变换操作-new

课程1-hadoop-Zookeeper安装 Ububtu18.04安装Zookeeper3.7.1 环境与版本 这里采用的ubuntu18.04环境的基本配置为&#xff1a; hostname 为master 用户名为hadoop 静态IP为 192.168.100.3 网关为 192.168.100.2 防火墙已经关闭 /etc/hosts已经配置全版本下载地址&#xff1…

【Java基础】2、Java基础语法

f2/fnf2&#xff1a;选中点中的文件名 ​​​​​​​ 1.注释 为什么要有注释&#xff1f; 给别人和以后的自己可以看懂的解释 注释含义 注释是在程序指定位置的说明性信息&#xff1b;简单理解&#xff0c;就是对代码的一种解释 注释分类 单行注释 //注释信息 多行注释…

NAT技术和代理服务器

NAT IP原理 之前我们讨论了, IPv4协议中, IP地址数量不充足的问题 NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:很多学校, 家庭, 公司内部采用每个终端设置私有…

基于SSM+小程序的购物管理系统1

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的购物管理系统1&#xff0c;可以实现首页、个人中心、商品分类管理、商品信息管理、特价商品管理、用户管理、留言板管理、系统管理、订单管理等功能。方便用户对首页、商品…

Java审计对比工具JaVers使用

最近有个需求&#xff0c;需要将页面的内容生成excel或者word文档&#xff0c;而且每次的修改都需要生成新的版本&#xff0c;同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象&#xff0c;同时存储到数据库一条新数据&#xff0c;对应数据表一…

stm32入门教程--DMA 超详细!!!

目录 简介 工作模式 1、数据转运DMA 2、ADC扫描模式DMA 简介 工作模式 1、数据转运DMA 这个例子的任务是将SRAM的数组DataA&#xff0c;转运到另一个数组DataB中&#xff0c;这个基本结构里的各个参数应该如何配置呢&#xff1f; 首先是外设站点和存储器站点的起始地址、…

Python 爬虫的寻宝大冒险:如何捕获 API 数据的宝藏

在这个信息爆炸的数字时代&#xff0c;数据就像是隐藏在网络深处的宝藏&#xff0c;等待着勇敢的探险家去发现。今天&#xff0c;我们要讲述的是如何成为一名 Python 爬虫探险家&#xff0c;装备你的代码工具&#xff0c;深入 API 的迷宫&#xff0c;捕获那些珍贵的数据宝藏。 …

时间序列预测(十五)——有关Python项目框架的实例分析

#1024程序员节&#xff5c;征文# 在之前的学习中&#xff0c;已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解&#xff0c;并能够将所学知识应用于实际中&#xff0c;我决定找一个完整的Python框架来进行深入学习。经过寻找&#xff0c;我终于找到了一篇非常具…

【338】基于springboot的IT职业生涯规划系统

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;it职业生涯规划系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以…

基于SSM+小程序的童装商城管理系统(商城3)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM小程序的童装商城管理系统实现了管理员及用户。 1、管理员实现了 首页、个人中心、用户管理、分类列表管理、童装商城管理、系统管理、订单管理。 2、用户实现了 注册、登录、首…

Spring Boot框架中小企业设备监控系统开发

3系统分析 3.1可行性分析 通过对本中小企业设备管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中小企业设备管理系统采用Spring Boot框架&#xff0…

QT实时显示日志内容

性能有待提高&#xff1b; 能够读取指定目录下的日志文件&#xff0c;显示在下拉框中。 选择某一个日志之后&#xff0c;点击获取数据按钮&#xff0c;能够实时刷新日志内容。 但是每次刷新都会对整个文件进行读取&#xff0c;文本框重新加载文本。效率很低&#xff0c;影响性能…