正则表达式与验证脚本

发布于 2023-03-20  442 次阅读


验证脚本

  • 将下面正则知识的部分写完已经感觉头昏脑胀了,但是所学的知识还只是正则中的一小部分,试着随便拿了一道题目来练了一下手,结果还是不能完全看懂正则表达式,比如下面这个例子:
正则
/[oc]:\d+:/i
字符串
O:11:"ctfShowUser":4:{s:21:"ctfShowUserusername";s:6:"xxxxxx";s:21:"ctfShowUserpassword";s:6:"xxxxxx";s:18:"ctfShowUseris
Vip";b:0;s:18:"ctfShowUserclass";O:8:"backDoor":1:{s:14:"backDoorcode";s:23:"system('ca
t flag.php');";}} 
  • 上面的例子中过滤了O:11:字符串,用眼睛看是比较难受的,但是幸运的是可以利用脚本来测试哪些字符串会受到过滤
  • preg_match函数提供了受到匹配的字符串部分,就可以写个小脚本来测试指定字符串的哪些部分被正则匹配了
  • 只需要把正则表达式和匹配字符串填入两个参数即可
 <?php
$patten="/[oc]:\d+:/i";
$in='O:11:O:8:"backDoor":1:{s:14:"backDoorcode";s:23:"system("cat flag.php");";}} ';
$a = preg_match_all($patten,$in,$mc);
var_dump($mc);
?>

(出了问题,改了一下)

  • 由于存在模糊匹配,试图列举出一个正则的所有匹配字符串是不可能的,只能做到这一步了

显式字符

[ABC]

  • 匹配 [...] 中的所有字符,例如 [aeiou] 匹配字符串 "google runoob taobao" 中所有的 e o u a 字母。

[^ABC]

  • 匹配除了 [...] 中字符的所有字符,例如 [^aeiou] 匹配字符串 "google runoob taobao" 中除了 e o u a 字母的所有字母。

[A-Z]

  • [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。

.

  • 匹配除换行符(\n、\r)之外的任何单个字符,相等于[^\n\r]。

[\s\S]

  • 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。

\w

  • 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

特殊字符

  • 所有特殊字符防止转义都是加\

\

  • 用来匹配单字符,例如/a7M/可以匹配a7M

*

  • 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。

+

  • 匹配前面的子表达式一次或多次。例如,zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。

?

  • 匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 "do" 、 "does"、 "doxy" 中的 "do" 和 "does"。

{n}

  • n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 "Bob" 中的 o,但是能匹配 "food" 中的两个 o。

{n.m}

  • m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3} 将匹配 "fooooood"中的前三个 o。

定位符

$

  • 匹配字符串结尾

^

  • 匹配字符串开头
下面的正则表达式匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首:

/^Chapter [1-9][0-9]{0,1}/

修饰符

  • /pattern/flags

i

  • ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
var str="Google runoob taobao RUNoob"; 
var n1=str.match(/runoob/g);   // 区分大小写
var n2=str.match(/runoob/gi);  // 不区分大小写

g

  • global - 全局匹配 查找所有的匹配项。
var str="Google runoob taobao runoob"; 
var n1=str.match(/runoob/);   // 查找第一次匹配项
var n2=str.match(/runoob/g);  // 查找所有匹配项

m

  • m 修饰符可以使 ^ 和 $ 匹配一段文本中每行的开始和结束位置。
var str="runoobgoogle\ntaobao\nrunoobweibo";
var n1=str.match(/^runoob/g);   // 匹配一个
var n2=str.match(/^runoob/gm);  // 多行匹配

s

  • 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 之后, . 中包含换行符 \n。
var str="google\nrunoob\ntaobao";
var n1=str.match(/google./);   // 没有使用 s,无法匹配\n
var n2=str.match(/runoob./s);  // 使用 s,匹配\n
届ける言葉を今は育ててる
最后更新于 2024-02-07