我正在尝试建立一个循环,以检测您是否输入了禁止的用户名。但是我想向用户报告进行了哪些匹配,以确定使用了哪些关键字来禁止该名称。您觉得这有什么问题吗?
function matchusername($bannedusername, $username)
{
foreach($bannedusername as $bannedusernam => $value){
if (strpos($username, $bannedusernam) !== false) {
$offendingusername = $value;
return true;
}
}
return false;
}
我还有更多代码将检查有效注释以及其他一些其他事项。
当我添加=>
$value
和$offendingusername = $value;
时,似乎只是中断了该循环并跳过了该循环并允许用户以任何方式发布。当我把这两个部分拿走时,它会检测到被禁止的用户名,并且不允许您像应有的那样发帖,但是我真的很想让它报告匹配的值,以便用户写长评论时,他们可以看看为什么他们不能发布。
我看了很多其他资料,这似乎是这样做的方法,但是它没有用。有任何想法吗?谢谢。
答案 0 :(得分:1)
似乎您在foreach循环中的键和值之间混合了 您的变量$ bannedusernam是数组键
为了修复返回值,一旦找到匹配项,我将使用一个布尔变量并使用break来使该foreach
function matchusername($bannedusername, $username)
{
$ret = false;
foreach($bannedusername as $key => $value){
if (strpos($username, $value) !== false) {
$offendingusername = $value;
$ret = true;
break;
}
}
if ($ret)
{
return $offendingusername;
} else {
return $ret;
}
}
答案 1 :(得分:0)
您应将$offendingusername
声明为全局变量。
function matchusername($bannedusername, $username)
{
global $offendingusername;
foreach($bannedusername as $bannedusernam => $value){
if (strpos($username, $bannedusernam) !== false) {
$offendingusername = $value;
return true;
}
}
return false;
}
另一个想法是返回匹配并进行检查。
function matchusername($bannedusername, $username)
{
foreach($bannedusername as $bannedusernam => $value){
if (strpos($username, $bannedusernam) !== false) {
return $value;
}
}
return false;
}
$ret = matchusername($bannedusername, $username);
if($ret !== false)
{
...
}
答案 2 :(得分:0)
更新后的答案
请运行print_r($bannedusername);
并在您的答案中发布,以便我们可以看到正在处理的数据类型。
但是在此之前请尝试一下:
function matchusername($username, $bannedusername){
foreach($bannedusername as $badWord){
if (strpos($username, $badWord) !== FALSE) {
return $username;
}
}
return FALSE;
}
这是您将如何使用它:
if($user = matchusername($username, $bannedusername)){
echo $user . ' You have a banned username.<br>';
}else{
echo 'Your post was successful.';
}