Php 我需要在注册过程中禁止使用某些单词

Php 我需要在注册过程中禁止使用某些单词,php,Php,现在,如果我想阻止某人使用名称主机Andy,这是完美的,但是如果有人创建用户名Ghost或类似的名称,这将非常糟糕。。我如何过滤它,使第一个字不再是主机 编辑: stripost($\u POST['username'],“host”)==0如果host(如中,host后跟空格)位于字符串开头,则为true,否则为false 如果可以在第一个单词前面加空格,则可能需要使用第一个 如果主机前面有符号,或者主机后面有符号,在字符串开头也需要禁止,请告诉我 不过,我会质疑为什么主机需要从用户名开始就被

现在,如果我想阻止某人使用名称
主机Andy
,这是完美的,但是如果有人创建用户名
Ghost
或类似的名称,这将非常糟糕。。我如何过滤它,使第一个字不再是主机

编辑:

stripost($\u POST['username'],“host”)==0
如果
host
(如中,host后跟空格)位于字符串开头,则为true,否则为false

如果可以在第一个单词前面加空格,则可能需要使用第一个

如果主机前面有符号,或者主机后面有符号,在字符串开头也需要禁止,请告诉我


不过,我会质疑为什么主机需要从用户名开始就被禁止。可以用不同的方式表示吗?例如,只有主机名为绿色斜体,这就不可能欺骗主机。

以下是我用来过滤网站上的脏话的方法。随心所欲地使用它。它应该给你指出正确的方向,因为它只过滤“我是个坏蛋”而不是“我是个坏蛋”

badwords.txt文件就是这样一个文件:

function filterBadWords($str) {
    $badWordsFile = "badwords.txt";
    $badFlag = 0;
    if(!is_file($badWordsFile)) {
        echo "ERROR: file missing: ".$badWordsFile;
        exit;
    }
    else {
        $badWordsFH = fopen($badWordsFile,"r");
        $badWordsArray = explode("\n", fread($badWordsFH, filesize($badWordsFile)));
        fclose($badWordsFH);
    }
    foreach ($badWordsArray as $badWord) {
        if(!$badWord) continue;
        else {
            $regexp = "/\b".$badWord."\b/i";
            $badword_add_last_letter = $badWord.substr($badWord, -1);
            $regexp_add_last_letter = "/\b".$badword_add_last_letter."\b/i";
            if(preg_match($regexp,$str)) $badFlag = 1;
            if(preg_match($regexp_add_last_letter,$str)) $badFlag = 1;
        }
    }
    if(preg_match("/\[url/",$str)) $badFlag = 1;
    return $badFlag;
}
编辑:

如果您只需要单词HOST,请使用以下功能:

badword1
badword2
badword3

您可以使用preg_match根据边界检查单词:

function filterString($str) {
    if(preg_match("/\bhost\b/i",$str)) return true;
    return false;
}
$pattern = "/\bhost\b/i";

if(preg_match($pattern, $_POST['username']))
{
    $errors[] = 'You cannot have the word HOST in your name.';
}
编辑

要仅匹配第一个单词,只需删除第一个单词边界:

function filterString($str) {
    if(preg_match("/\bhost\b/i",$str)) return true;
    return false;
}
$pattern = "/\bhost\b/i";

if(preg_match($pattern, $_POST['username']))
{
    $errors[] = 'You cannot have the word HOST in your name.';
}
进一步编辑:添加^character以单词host开头。这告诉regex它必须以host开头,不区分大小写。

如果要停止创建以
“host%”开头的用户名,请执行以下操作:

$pattern = "/^host\b/i";
更新:

我添加了一个简单的方法,以使事情更安全,防止更恶劣的方法;
当您通过
“主机”
案例时,可以随意移除它,而不是处理修剪

最后,虽然不清楚,但如果您想停止
“主机”
,但允许
“主机”
(?),只需更改:

if (substr(ltrim(strtolower($_POST["username"])),0,4)=="host") {
   $errors[] = 'You cannot have the -starting- word HOST in your name.';
}


strtolower
将对字符串强制转换一个整数如果我希望我的用户名是“敌对的”,那么一旦我添加了它,它似乎就不会在任何地方识别用户名中的主机,也不会显示错误消息?我实施错了吗?我将更新问题。@user2305310这怎么可能?如果字符串以“host”开头,则不区分大小写,stripos将返回0,并且0===0为真。我需要停止此操作的原因只是为了防止人们试图模仿主机,从而阻止那些将为其恶搞而上当的人上当。可能看起来有些牵强,但它可能会拯救一些人。这可以只匹配字符串的开头吗?是的。删除第一个边界$pattern=“/host\b/i”;这很好用。谢谢你,我会在3分钟内接受你的回答。@KaiQing这不符合像“Ahost Andy”这样的说法吗?因为
host\b
匹配这个词是的,但他似乎只关心字面上的“host”一词。非常感谢您为我提供了这个词,我将保存它以备将来参考。如果您只需检查第一个词是否为host,然后停止。这将查看是否为“host”一词存在于字符串中的任何位置。例如,“怀有敌意的安迪”将顺利通过并返回false,但“主持人安迪”不会通过,它将返回true。编辑后的帖子将包含更多您正在寻找的内容。我可以使用名称
敌对安迪
?敌对安迪不会喜欢这个。我的更新版本希望
敌对安迪
,也希望
敌对玛丽
,但不
廉价主机
恶劣主机
。。。好吧,这要看情况而定,我想我涵盖了所有的情况。你为什么不创建一个禁词函数,并使用strpos
if (substr(ltrim(strtolower($_POST["username"])),0,5)=="host ") {