PHP检查字符串是否包含多个'?'或双'//'

时间:2019-07-19 11:00:03

标签: php regex preg-match

我有一个表达式检查是否有.\%

$str = '/index.php?url=cont\roller//act%ion?id=5';
if(preg_match('/[.\\\\%]/', $str)){
    //do something
}

现在,我正在尝试检查字符串是否包含多个1 ?或它是否具有'//'一个或多个双倍或更多的正斜杠(很明显,这是错误的{{1 }}。

有没有一种方法可以在一个表达式中检查所有这些?

谢谢!

2 个答案:

答案 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)是否在该字符串中的任何位置多次(重复)