一个很小很小的知识点,题目源码:
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应该是结尾被当作正常的结束符号忽略了也算是个特例了