php strpos没有返回任何值

时间:2016-05-16 02:49:28

标签: php strpos

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

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

包括我的代码。我添加了一个回显线来显示返回的位置,并使用包含测试单词或不包含测试单词的帖子进行测试。无论出于何种原因,它始终返回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 个答案:

答案 0 :(得分:2)

正如其他人所指出的那样,您正在向后测试该值,因为如果找不到搜索字符串,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
    }       
}

答案 1 :(得分:0)

我认为你应该使用正则表达式解决这个问题,这是一个正则表达式的例子

tableView.deselectRowAtIndexPath(indexPath, animated: true)
if let selected = self.lastSelected {
   tableView.cellForRowAtIndexPath(selected)?.accessoryType = .None
}
tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = UITableViewCellAccessoryType.Checkmark
self.lastSelected = indexPath