2013-05-09 56 views
1
if (strtolower(strpos($_POST['username']), "host") !== FALSE) { 
        $errors[] = 'You cannot have the word HOST in your name.'; 
       } 

现在,这是完美的,如果我想用的名字Host Andy例如阻止某人,但可怕的如果有人创建了用户名和Ghost的一致好评..如何过滤它只停止第一个字是主机?我需要在我注册过程中禁止某些话

编辑:如果host(如,主机后面有一个空格)是在字符串和错误的开始,否则

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

你为什么不创建的屏蔽词的功能,并使用'strpos' ? – 2013-05-09 02:47:07

回答

2

您可以使用preg_match来检查基于边界上的字:

$pattern = "/\bhost\b/i"; 

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

编辑

只匹配第一个字时,只要将第一个字边界:

$pattern = "/^host\b/i"; 

进一步编辑:添加^字符开头的字符串主机这个词。这说明了正则表达式必须以主机作为单个字开始,不区分大小写。

+0

可以这样做只匹配字符串的开始? – Patashu 2013-05-09 02:29:10

+0

是的。删除第一个边界。 $ pattern =“/ host \ b/i”; – 2013-05-09 02:29:52

+0

这很好。谢谢,我会在3分钟内接受你的回答。 – user2305310 2013-05-09 02:30:03

0

stripos($_POST['username'], "host ") === 0将是真实的。

如果第一个单词之前的空格是可能的,您可能首先需要使用http://www.php.net/manual/en/function.ltrim.php

如果带有符号的主机或者带有符号的主机在字符串的开始处也需要禁止,请告诉我。

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

+1

'strtolower'会将一个整数转换为一个字符串 – zerkms 2013-05-09 02:23:01

+1

如果我想让我的用户名成为“敌对”,我该怎么办? – 2013-05-09 02:23:24

+0

我认为它现在是正确的。 – Patashu 2013-05-09 02:25:38

0

这是我用来过滤我的网站上的坏词。用它来满足你的喜好。它应该指向正确的方向,因为它只会过滤“我是坏字”而不是“iamabadword”。

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; 
} 

和文件badwords.txt只是看起来像这样的文件:

badword1 
badword2 
badword3 

编辑:

如果您只是想字HOST,然后使用此功能:

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

非常感谢您向我提供此信息,我将把它保存以备将来参考。 – user2305310 2013-05-09 02:30:22

+0

欢迎您!它已经派上用场了! – alexander7567 2013-05-09 02:34:56

+0

它看起来像这样可以工作,如果你只是检查,看看第一个字是主机,然后停止。 – Patashu 2013-05-09 02:35:06

1

,如果你想停止用户名要创建与"host%"开始,然后做:

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

UPDATE:

我加入了ltrim只是为了保持对更多更安全讨厌的方法;
随时可以将其删除,并在您通过"host"的情况下处理修剪。(?)

最后,虽然它没有明确的,如果你想停止"host"但允许"host ",只是改变:

if (substr(ltrim(strtolower($_POST["username"])),0,5)=="host ") { 
+0

我可以使用“敌对安迪”这个名字吗? – Patashu 2013-05-09 02:30:36

+0

不,你不能,它开始于“主机” – 2013-05-09 02:32:22

+1

敌对安迪不会喜欢这个。 – 2013-05-09 02:48:31