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 ") {