preg_match成功后的代码循环

时间:2013-04-23 16:35:28

标签: php preg-match

我遇到了非常奇怪的代码行为。基本上在应该返回true的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数组包含:

$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返回1或0,具体取决于它是否为preg_match成功或失败,如果有错误则返回false。不知道这里发生了什么,如果有人能指出我正确的方向

1 个答案:

答案 0 :(得分: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.";
}

输出:

  

找到了一场比赛。