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

news2024/11/29 0:41:44

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!";
else
    echo "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!";
else
    echo "pass!";

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

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

 

 

 

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

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

相关文章

27.Redis哨兵架构

Redis哨兵高可用架构 Sentinel&#xff08;哨兵&#xff09;是一种特殊的 Redis 服务&#xff0c;其主要功能并非提供常规的读写服务&#xff0c;而是专门用于监控 Redis 实例节点。 1.在哨兵架构下&#xff0c;客户端&#xff08;client 端&#xff09;首次会从哨兵处找出 Re…

STM32G474硬件CRC7和软件CRC7校验

1、CRC7的多项式和初始值 #define CRC_Hardware_POLYNOMIAL_7B 0x09//硬件CRC多项式为0x09 //SD卡中的校验算法CRC7&#xff0c;生成多项式为x^7 x^3 1&#xff0c;由于bit7不存在&#xff0c;只有bit31和bit01&#xff0c;所以多项式为0x09#define CRC7_INIT_VALUE 0…

Java基础 —— IO流详解

IO流 在Java中&#xff0c;IO&#xff08;输入/输出&#xff09;流是用于在程序与外部世界&#xff08;如文件、网络、内存等&#xff09;之间传输数据的机制。IO流分为两大类&#xff1a;输入流&#xff08;InputStream/Reader&#xff09;和输出流&#xff08;OutputStream/…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用&#xff1f;小结&#xff1a;同步调用优缺点 1-2 异步调用什么是异步调用&#xff1f;小结&#xff1a;异步调用的优缺点&#xff0c;什么时候使用异步调用&#xff1f; 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数

文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座&#xff0c;并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站&#xff0c;可见性分析确定地面站坐标分析单颗…

Excel菜单选项无法点击?两种原因及解决方法全解析

在使用Excel处理数据时&#xff0c;有时会遇到菜单选项无法点击的情况。这种问题会影响到正常的操作和编辑。出现这种情况的原因可能有多种&#xff0c;本文将介绍两种常见的原因&#xff0c;并提供相应的解决方法&#xff0c;帮助小伙伴们快速恢复菜单选项的正常使用。 原因一…

【银河麒麟高级服务器操作系统·实例分享】裸金属服务器开机失败分析及处理建议

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 裸金属物理服务器开机卡在EFI stub页面…

基于Spring Boot的在线摄影工作室开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理网上摄影工作室的相关信息成为必然。开发合…

UE5蓝图中整理节点的方法

UE5蓝图中整理节点的方法 第一种&#xff1a;子图 右键选中的节点&#xff0c;出现一个面板&#xff0c;点击 Collapse Nodes 既可折叠选中的所有节点 注意&#xff1a;子图不可以被复制使用。 双击子图可以查看节点&#xff0c;若不想折叠选中的节点为子图&#xff0c;右键点…

喜讯丨江苏省医药行业协会·中药饮片专业委员会2024年度三届五次会员代表大会暨《江苏中药饮片》通讯员年度表彰大会圆满举行

2024年10月25日&#xff0c;江苏省医药行业协会中药饮片专业委员会三届五次&#xff08;2024年度&#xff09;会员代表大会暨《江苏中药饮片》通讯员年度表彰大会在苏州香格里拉大酒店隆重召开。 江苏省药品监督管理局、药品生产监管局、江苏省医药行业协会、江苏省食品药品监督…

git push到远程怎么回退

git push到远程服务器想继续修改&#xff0c;你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令&#xff0c;回退很简单。 按照下面的流程操作就行&#xff1a; 1.查看提交历史 首先&#xff0c;使用git log命令查看提交历史。可以使用以下命令显…

回溯法 | 无限个for循环?

文章目录 起因实现 优化 起因 回溯算法&#xff0c;寻找问题的所有解或最优解 最开始遇到这样一个问题&#xff0c;认为可以用几个for循环暴力解决&#xff0c;然而仔细观察后发现&#xff0c;针对不同的输入&#xff0c;我需要的for循环的个数不一样&#xff0c;只能使用递归…

react18中react-thunk实现公共数据仓库的异步操作

redux及react-redux都只能实现数据的同步修改更新&#xff0c;有点类似于vue中的mutation&#xff0c;只能做同步操作&#xff0c;异步的话不用actions来实现。由于在项目始终不可避免要实现的异步数据的更新&#xff0c;这明显不够用了。是时候引入我们的异步中间件redux-thun…

原生js实现拖拽上传(拖拽时高亮上传区域)

文章目录 drop相关事件说明-MDN演示代码&#xff08;.html) drop相关事件说明-MDN 演示 代码&#xff08;.html) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"…

最新XL换脸术!EcomID,更像更强,结合InstantID和PuLID优点,200万训练集,6.6显存占用,ComfyUI

由阿里妈妈最新开源的换脸工具&#xff1a;EcomID&#xff0c;结合了InstantID和PuLID优点&#xff0c;以获得更好的背景一致性、面部关键点控制、更真实的面部以及更高的相似度。旨在从单个ID参考图像生成定制的保ID图像&#xff0c;优势在于很强的语义一致性&#xff0c;同时…

情感咨询小程序的市场需求大吗?

情感咨询小程序的市场需求较大&#xff0c;主要体现在以下几个方面&#xff1a; 情感问题普遍存在5&#xff1a; 恋爱关系困扰&#xff1a;在恋爱过程中&#xff0c;人们经常会遇到诸如沟通不畅、争吵频繁、信任危机等问题。例如&#xff0c;年轻人在恋爱初期可能会因为不了解…

技术分享 | 大语言模型增强灰盒模糊测试技术探索

大语言模型凭借其庞大的参数规模&#xff0c;能够通过无监督学习从海量文本中获取知识&#xff0c;从而不仅能够深刻理解文本语义&#xff0c;还能准确识别文本的格式和结构。凭借对不同数据结构的深度理解&#xff0c;大语言模型已在众多领域得到广泛应用。其中&#xff0c;尤…

Cmake Error:could not find any instance of Visual Studio.

出现以下错误 解决方案&#xff1a; 安装visual stuido 2017。 检查是否安装“使用C的桌面开发” 检查是否安装了扩展开发 点开“单个组件”是否安装了以下组件 编辑计算机环境变量&#xff0c;

linux查看文件命令

查看文件命令 显示命令 cat 语法&#xff1a;cat 【选项】 文件 选项 命令含义n显示行号包括空行b显示行号不包括空行s压缩空行为一行A显示隐藏字符 cat -n 文件&#xff1a;显示行号包括空行 cat -b 文件 cat -s 文件 cat -A 文件 more和less是 分页查看 tac和rev都…

使用Python统计目录下所有.txt文件中的字符数

前言 在日常开发或数据处理中&#xff0c;我们经常需要对大量文本文件进行各种统计操作&#xff0c;比如计算总字数。本文将介绍一种简单的方法&#xff0c;通过Python脚本遍历指定目录下的所有.txt文件&#xff0c;并统计这些文件中的字符总数。这个过程可以帮助开发者更好地…