0%

PHP 正则的 m多行模式

一个很小很小的知识点,题目源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}

这里第一个preg_match 里的正则模式i m 表示不区分大小写和多行模式。测试如下:

1
2
3
4
5
6
7
8
<?php
$a="php\n";
echo preg_match('/^php$/im', $a);
// 1
$a="ph\n"; //0
$a="ph\nphp"; //1
$a="ph\nph"; //0
$a="ph\nph\nphp"; //1

就是说多行模式,每一次的换行都会开启新的匹配,然后只要有一个匹配成功就返回真。
下面再看看不加m多行模式的。

1
2
3
4
5
6
7
8
9
10
<?php
$flag="flag{111}";
$a="ph\nph\nphp";
echo preg_match('/^php$/i', $a);
//0
$a="php\nph\np"; //0
$a="php\nphp"; //0
$a="php\n"; //1
$a="php\n\n";//0
$a="\nphp"; //0

也就是说他把说有的行当作一条数据匹配。不会因为换行而被分段。其中$a="php\n"; 为1应该是结尾被当作正常的结束符号忽略了也算是个特例了


-------------本文结束感谢您的阅读-------------