我有一个表达式检查是否有.
,\
或%
:
$str = '/index.php?url=cont\roller//act%ion?id=5';
if(preg_match('/[.\\\\%]/', $str)){
//do something
}
现在,我正在尝试检查字符串是否包含多个1 ?
或它是否具有'//'一个或多个双倍或更多的正斜杠(很明显,这是错误的{{1 }}。
有没有一种方法可以在一个表达式中检查所有这些?
谢谢!
答案 0 :(得分:1)
if(preg_match_all('/[.\\\\%]|\/{2,}/', $str)){
}
要确保您的正则表达式能够检测到.
中的index.php
,如果它是/index.php
,则只需删除字符串的开头
在控制台上运行:
$str = '/index.php?url=cont\roller//act%ion?id=5';
preg_match_all('/[.\\\\%]|\/{2,}/', $str, $matchs);
var_dump($matchs);
array(1) {
[0]=>
array(4) {
[0]=>
string(1) "."
[1]=>
string(1) "\"
[2]=>
string(2) "//"
[3]=>
string(1) "%"
}
}
答案 1 :(得分:0)
好吧,经过1天的反复试验,这是我可以想到的解决方案(部分内容来自@ N69S答案):
if(preg_match_all('/[.\\\\%]|\/{2,}|(\?)(?=\?|.+\1)/', $str)){
//do something
}
模式说明:
[.\\\\%]
,该部分将与.
,\
或%
相匹配,如果其中一个字符被匹配,则返回1
({{1 }},每次出现其中一个字符
+1
这部分将匹配\/{2,}
两倍或多于两倍的正斜杠(//
//
///
等
////
这部分将检查(\?)(?=\?|.+\1)
是否在该字符串中的任何位置多次(重复)