2013-04-23 30 views
0

我遇到真正奇怪的代码行为。基本上在应该返回true的preg_match上,下一个语句不会自行执行。让我用我自己的代码演示:preg_match成功后代码循环

foreach($params as $param) 
{ 
    error_log("processing $param"); 
    $doesInputContainBadCode = preg_match("/<script\b[^>]*>([\s\S]*?)<\/script>/m",$param); 
    error_log("input contains bad code? :".$doesInputcontainBadCode); 
    if($doesInputContainBadCode === 1) 
    error_log("process this input"); 
} 

说,如果我的$参数数组组成:

$params = {"first_name","last_name","middle_name","<script type="text/javascript">alert("javascript massacre");</script>", "whatever", "something else"} 

这就是error_log中显示:

processing first_name 
input contains bad code? : 0 
processing last_name 
input contains bad code? : 0 
processing middle_name 
input contains bad code? : 0 
processing <script type="text/javascript">alert("javascript massacre");</script> 
processing whatever 

注意如何处理后“javascript”包含参数,它跳过了error_log。它应该有记录 输入包含错误代码? :1个 处理此输入

然而,没有被记录。至少,我认为它必须记录:

输入包含错误代码? :

不管preg_match结果的结果如何。但它显然没有,它不仅仅是为了这个输入,而是重复了preg_match成功执行这个行为的任何输入。

PHP documentation指出preg_match根据preg_match成功还是失败返回1或0,如果发生错误,则返回false。不知道发生了什么在这里,如果有人能在正确的方向

+0

嗯,你是不是'break'ing出你的循环的早期.... – 2013-04-23 16:37:46

+0

不知道我跟着 – 2013-04-23 16:38:02

+0

在标题扫视(“代码循环后的preg_match成功”),并在你的'foreach'循环,循环中没有'break'语句。因此,循环将遍历整个'$ param'数组,不管您的正则表达式是否生成匹配。 – 2013-04-23 16:39:07

回答

1

您应该只针对一个错误

更改日志PHP 5.3.6返回FALSE测试===如果偏移大于主体长度高点我。
以上是错误。

警告

这个函数可以返回布尔值FALSE,但也可能返回的结果为FALSE的非布尔值。有关更多信息,请阅读布尔部分。使用===运算符来测试此函数的返回值。

正如你可以在你的日志中看到的,它永远不会运行低谷

if($doesInputContainBadCode === 1) 
    error_log("process this input"); 
} 

你必须测试,例如。

$param ="<script type=\"text/javascript\">alert(\"javascript massacre\");</script>"; 
if (preg_match("/<script/i", $param)) { 
    echo "A match was found."; 
} else { 
    echo "A match was not found."; 
} 

输出:

找到匹配项。