当前位置: 首页 > article >正文

详解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!";
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.kler.cn/a/370785.html

相关文章:

  • 将图像输入批次扁平化为CNN
  • MySQL程序之:使用类似URI的字符串或键值对连接到服务器
  • 使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))
  • 网络设备安全保证计划 (NESAS) - 供应商视角 笔记
  • springcloud中的Feign调用
  • 51单片机——DS18B20温度传感器
  • SQL 与 MY SQL
  • Python实现基于WebSocket的stomp协议调试助手工具
  • 《MYSQL实战45讲》表数据删一半,为什么表文件大小不变?
  • 算法题解记录32+++最长连续序列(百题筑基)
  • 【专题】计算机网络之数据链路层
  • 【数据结构和算法】二、python中的常用数据结构(数组、链表、堆栈、递归、二叉树、哈夫曼树等数据结构的基本原理讲解与实战演练)
  • PyTorch中Transformer 模型介绍
  • 【Linux系统编程】线程深入运用
  • K-fold交叉验证后如何确认最终模型权重
  • 通过异地组网工具+RustDesk实现虚拟局域网使用远程桌面RDP
  • android源码 system目录下 android源码目录结构
  • Microsoft Office PowerPoint制作科研论文用图
  • vue Element U 解决表格数据不更新问题
  • 服务器数据恢复—异常断电导致服务器挂载分区无法访问的数据恢复案例
  • Day3 - Playwright 页面元素
  • Radar Fields: Frequency-Space Neural Scene Representations for FMCW Radar 笔记
  • 一篇文章入门梅尔频率倒谱系数
  • 【HarmonyOS】判断应用是否已安装
  • Spring Boot框架:打造可扩展的论坛网站
  • pycharm 中 json 库的常用操作