代码之家  ›  专栏  ›  技术社区  ›  Dan Smith

php strpos未返回任何值

  •  3
  • Dan Smith  · 技术社区  · 9 年前

    因此,我的网站收到了大量垃圾邮件。

    为了过滤掉其中的一些内容,我想测试帖子的正文,以确保它不包含某些单词。如果他们这样做了,给用户一个即时(临时)禁令。

    包括我的代码。我添加了一条回音线来显示返回的位置,并用包含或不包含测试词的帖子进行测试。无论出于什么原因,它总是返回null,并且不显示任何内容。是否不允许将$_POST变量传递到此函数中?

    代码:

        $bannedwords = array ("spam word", "foo", "bar", "foobar", "quarry");
    foreach ($bannedwords as $bannedphrase) {
        $pos = strpos($_POST['body'], $bannedphrase);
        echo 'The position is: ' . $pos;
        if ($pos === FALSE){            
            //require_once 'inc/mod/ban.php';
            //Bans::new_ban($_SERVER['REMOTE_ADDR'], 'Suspected Spammer.', '2', $_POST['board'] == '*' ? false : $_POST['board']);
            error($config['error']['bannedword']);
        }       
    }
    

    编辑:我确实看到了一个逻辑错误,但我不认为它破坏了代码。然而,也许是这样。如果用户在数组的早期被禁止,If语句会继续,这可能是我稍后看到空值的原因吗?

    2 回复  |  直到 9 年前
        1
  •  3
  •   Sgt AJ    9 年前

    正如其他人指出的那样,您正在反向测试该值,因为只有在未找到搜索字符串时,strpos才会返回FALSE。此外,在搜索POST变量之前,回显它,以确保它是您认为的那样。

    尝试以下代码:

    $bannedwords = array ("spam word", "foo", "bar", "foobar", "quarry");
    
    if (isset($_POST['body'])) { echo 'POST: ', $_POST['body'], '<br/>'; }
    else { echo 'No POST variable found!'; }
    
    foreach ($bannedwords as $bannedphrase) 
    {
        $pos = strpos($_POST['body'], $bannedphrase);
    
        if ($pos === FALSE)
        {
            echo '  Banned word not found.';
        }
        else
        {
            echo '  Banned word found at position: ', $pos;
    
            //require_once 'inc/mod/ban.php';
            //Bans::new_ban($_SERVER['REMOTE_ADDR'], 'Suspected Spammer.', '2', $_POST['board'] == '*' ? false : $_POST['board']);
    
            error($config['error']['bannedword']);
            break; // This will exit the foreach loop
        }       
    }
    
        2
  •  0
  •   Oscar L. Sanchez Jara    9 年前

    我认为您应该使用regex来解决这个问题,这是一个regex示例

    $regex = "/(spam|bar|foo)/";
    $phrase = "This is a spam message";
    echo preg_match($regex, $phrase);
    
    # The regex show 0 or 1