【问题标题】:php strpos not returning any valuephp strpos没有返回任何值
【发布时间】:2016-05-16 02:49:27
【问题描述】:

所以,我的网站收到了大量垃圾邮件。

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

包括我的代码。我添加了一条回声线来显示返回的位置,并使用包含或不包含测试词的帖子进行测试。无论出于何种原因,它总是返回 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 语句会继续,这可能是我稍后看到空值的原因?

【问题讨论】:

  • 这不是倒过来的吗?如果它的false 意味着它没有找到任何东西,只需确保$_POST['body'] 不为空,并注意那些字母大小写
  • @statosdotcom 三个等于有什么问题?
  • @RodrigoDuterte,阅读示例.. $pos 值不应该为 null,即使在 if() 块发挥作用之前也是如此。
  • @DanSmith 然后是$_POST['body'] 的问题,而不是strpos,它只处理正在喂的东西,因为当strpos 坏了时,这就是为什么我说确保$_POST['body'] 身体不是空的
  • “空”? echo 不会输出“null”。使用var_dump($pos) 看看你真正得到了什么。可能是false,这可能意味着一切正常;但是如上所述,您的 if 似乎倒退了。

标签: php strpos


【解决方案1】:

正如其他人指出的那样,您正在向后测试该值,因为 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
    }       
}

【讨论】:

  • 这与我最终想出的类似,只是我使用了 if ($pos !== FALSE) 而没有 else 块
  • 不错。 :) 是的,带有额外回声的 else 块只是用于测试以帮助查看问题所在。
【解决方案2】:

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

$regex = "/(spam|bar|foo)/";
$phrase = "This is a spam message";
echo preg_match($regex, $phrase);

# The regex show 0 or 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 2019-04-24
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多