Ngkcvs3's blog Ngkcvs3's blog
首页
  • 漏洞复现
  • JavaScript文章
  • VPS
  • web
  • AWD
  • CSS
  • Test
  • 技术文档
  • GitHub技巧
  • 《Git》学习笔记
  • 博客搭建
  • Nodejs
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Ngkcvs3

Blog
首页
  • 漏洞复现
  • JavaScript文章
  • VPS
  • web
  • AWD
  • CSS
  • Test
  • 技术文档
  • GitHub技巧
  • 《Git》学习笔记
  • 博客搭建
  • Nodejs
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • web

    • web&misc

    • unserialize
    • PHP正则表达式
      • 1. preg_match 函数
        • 语法:
        • 举例:
    • php反序列化题目收集
    • BugKu-web
    • 青少年CTF练习平台-web
    • 文件包含与php伪协议
    • ctfshow命令执行
  • AWD

  • CSS

  • Test

  • CTF
  • web
Ngkcvs6
2025-03-05
目录

PHP正则表达式

# PHP正则表达式

# 1. preg_match 函数

用于执行一个正则表达式匹配。正则表达式描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配、查找、替换及分割等操作。作为一个匹配模板,是由原子、特有功能字符及模式修正符三部分组成的文字模式。

元字符:具有特殊含义的字符,如 ^(开始)和 $(结束);
原子:用来匹配的字符,如果 \d(匹配0到9);
定界符:除了字母、数字和反斜线‘\’以外的任何字符都可以作为定界符,如 #、!等都是可以作为定界符,但是行业习惯这样做:/正则表达式/。
元字符     含义
*     0次1次或多次
+     1次或多次
?     0次或1次
.     除了换行外的其他字符
|     或选择
{n}     正好n次
{n,}     不少于n次
{n,m}     区间,>=n,<=m
^或\A     正则的开始
$或\Z     正则的结束
\b     单词的边界
\B     单词边界以外
[]     其中任意一个
[^]     除了[]中的以外
()     作为一个整体

原子:一些特殊符号,如:* ’ ” + \等,需要使用 \ 来进行转义。
原子字符     含义     举例
\cx     匹配由x指明的控制字符     如 \cM匹配一个回车符,x的值必须为A~Z或a~z之一,否则将c视为匹配‘c’
\f     匹配一个换页符     
\n     匹配一个换行符     
\r     匹配一个回车符     
\t     匹配一个指标符     在不使用表格的情况下在垂直方向按列对齐文本
\v     匹配一个垂直制表符     
        
\d     0到9任意一个数字     等价于[0-9]
\D     除0到9之外的字符     等价于[^0-9]
\s     空白字符     等价于[\f\n\r\t\v]
\S     除了空白字符     
\w     数字、字母或下划线     [0-9a-zA-Z]
\W     除了数字、字符或下划线     可以理解为特殊字符,如*、$等

模式修正符:在最后一个细线‘/’之后使用,如 /php/i
模式修正符     含义
i     不区分大小写
m     将字符视为多行
s     将字符串视为单行,换行符作为普通的字符
x     忽略空白
U     取消贪婪模式,等同于在数量符之后添加一个问号,比如 .*?

后向引用:使用()时,会将其相关的匹配存储到一个临时的缓存区,缓存区编号从1-99,使用 \1(“\1”)来获取缓存区内容,可以使用 ?: 或 ?= 或 ?! 来忽略相关的缓存内容。
/(windows)(linxu)\2/ 这样是使用第二个缓存区的内容,linux;
/(?:windows)(linux)\1/,忽略了第一缓存区的内容,linux。

贪婪模式:概念不好解释,直接上代码去理解
$str = '发财123发财发财456发财发财abc发财';
$pattern = '/发财.*发财/'; // 匹配始末发财中的内容
$pattern2 = '/发财.*?发财/'; // 匹配所有发财中的内容
$pattern3 = '/发财.*发财/U'; // 效果等同上一行
preg_match_all($pattern, $str, $matches);
preg_match_all($pattern2, $str, $matches2);
preg_match_all($pattern3, $str, $matches3);
var_dump($matches);
var_dump($matches2);
var_dump($matches3);

中文匹配:这个不常用到,知道要点即可。
- UTF-8汉字编码范围是:0x4e00–0x9fa5,使用 u 模式修正符使字符串被当成UTF-8。
- gb2312汉字编码范围是:0xb0–0xf7,0xa1–0xfe,使用 chr 将其转为字符串。

常用函数:preg_match、preg_match_all
preg_match返回0或者1,它在完成第一次匹配后停止搜索;preg_match_all会一直匹配目标到结束;如果如果发生错误preg_match()返回 FALSE。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 语法:

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
1

# 举例:

  1. 查找文本字符串"php":

    <?php
    //模式分隔符后的"i"标记这是一个大小写不敏感的搜索
    if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
        echo "查找到匹配的字符串 php。";
    } else {
        echo "未发现匹配的字符串 php。";
    }
    ?>
    
    1
    2
    3
    4
    5
    6
    7
    8

    结果如下:

    查找到匹配的字符串 php。

  2. 查找单词 "web":

    模式中的 \b 标记一个单词边界,所以只有独立的单词"web"会被匹配,而不会匹配 * 单词的部分内容比如"webbing" 或 "cobweb"

    if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
        echo "aaa\n";
    } else if(preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")){
        echo "bbb\n";
    }
    
    1
    2
    3
    4
    5

    结果如下:

    aaa

    bbb

参考资料

https://blog.csdn.net/yb546822612/article/details/90671244 (opens new window)

https://blog.csdn.net/xiaolinyui/article/details/134892835 (opens new window)

编辑 (opens new window)
上次更新: 2025/06/08, 09:36:22
unserialize
php反序列化题目收集

← unserialize php反序列化题目收集→

最近更新
01
test文件
11-07
02
CSS给table的tbody添加滚动条
11-07
03
网格布局中的动画
11-07
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Ngkcvs3 | 89374048309748324003097832
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
欢迎来到
看板娘