1

在这里,我得到了这个功能:

public function strposa($haystack, $needles=array(), $offset) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}

和这个:

   function usernameCurseWords($name) {
      $string = $name;
      $array  = array('bad', 'words', 'are', 'here');

      if (parent::strposa($string, $array, 0)) {
         return true;
      }
   }

我这样称呼它:

if ($this->usernameCurseWords($username)) { throw new Exception($error['userCurseWords']); }

如果 haystack 为“1bad”,则该函数将返回 true(“bad”是针)。

但是,如果 haystack 是“badblablbla”,则该函数返回 false。

知道为什么这不能正常工作吗?

4

3 回答 3

1

你知道 strpos 将返回针存在的位置相对于 haystack 字符串的开头(与偏移量无关)。另请注意,字符串位置从 0 开始,而不是 1。

因此,如果您的字符串在 0 位置找到,它将返回零。

但是在您的 usernameCurseWords() 中,如果条件如此。

如果在零位置找到位置,则将其视为假;明白了我的意思。

echo strpos('badall', 'bad',0);

将返回 0。在 0 位置找到的 b/c 位置。

echo strpos('1badall', 'bad',0);

将返回在 1 个位置找到的 1 个 b/c 位置。

if (parent::strposa($string, $array, 0)) {
     return true;
  }

但是这条线只有在 return 为 1 时才会接受。所以据此更改你的代码。

if (parent::strposa($string, $array, 0) !== false) {
     return true;
  }

// 尝试类型匹配。

于 2013-09-08T03:17:10.580 回答
0

这一行: if(empty($chr)) return false;

empty(0) = true 所以当偏移量为零时,你会得到 true

于 2013-09-08T02:53:47.047 回答
0
!== FALSE ... and 0 is not the same, FALSE is boolean, 0 (zero) not

所以只需使用

!=
于 2013-09-08T02:48:00.700 回答