php strpos 没有返回任何值
php strpos not returning any value
所以,我的网站收到了大量垃圾邮件。
为了过滤掉其中的一些内容,我想测试 post 的正文以确保它不包含某些词。如果他们这样做,请立即(临时)禁止用户。
包括我的代码。我添加了一条回声线来显示返回的位置,并用 posts 测试了包含或不包含测试词。无论出于何种原因,它总是 returns 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 语句会继续,这可能是我稍后看到空值的原因?
我认为你应该使用正则表达式来解决这个问题,这是一个正则表达式示例
$regex = "/(spam|bar|foo)/";
$phrase = "This is a spam message";
echo preg_match($regex, $phrase);
# The regex show 0 or 1
正如其他人指出的那样,您正在向后测试该值,因为如果未找到搜索字符串,strpos 只会 return 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
}
}
所以,我的网站收到了大量垃圾邮件。
为了过滤掉其中的一些内容,我想测试 post 的正文以确保它不包含某些词。如果他们这样做,请立即(临时)禁止用户。
包括我的代码。我添加了一条回声线来显示返回的位置,并用 posts 测试了包含或不包含测试词。无论出于何种原因,它总是 returns 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 语句会继续,这可能是我稍后看到空值的原因?
我认为你应该使用正则表达式来解决这个问题,这是一个正则表达式示例
$regex = "/(spam|bar|foo)/";
$phrase = "This is a spam message";
echo preg_match($regex, $phrase);
# The regex show 0 or 1
正如其他人指出的那样,您正在向后测试该值,因为如果未找到搜索字符串,strpos 只会 return 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
}
}