2009-08-05 19 views
1

的。我在那是非法的在这样的模式变量设置昵称用单词的小列表模式的occurence:找到一组字

$pattern = webmaster|admin|webadmin|sysadmin 

使用preg_match,我怎么能做到如此那些昵称与这些词是禁止的,但注册类似“admin2”或“thesysadmin”是允许的?

这是我到目前为止的表达:

preg_match('/^['.$pattern.']/i','admin'); 

//不应该被允许

注:使用\b并没有太大帮助。

回答

3

根本不使用正则表达式呢?
并与explodein_array

举例来说,这将做到:

$pattern = 'webmaster|admin|webadmin|sysadmin'; 
$forbidden_words = explode('|', $pattern); 

它爆炸的模式变成一个数组,使用|作为分隔符。


这:

$word = 'admin'; 
if (in_array($word, $forbidden_words)) { 
    echo "<p>$word is not OK</p>"; 
} else { 
    echo "<p>$word is OK</p>"; 
} 

将让你

admin is not OK 

鉴于此(相同的代码,只有两个字的变化)

$word = 'admin2'; 
if (in_array($word, $forbidden_words)) { 
    echo "<p>$word is not OK</p>"; 
} else { 
    echo "<p>$word is OK</p>"; 
} 

会得到你

admin2 is OK 

这样一来,无需担心找不到合适的正则表达式,匹配全词:它只会匹配的原话;-)


编辑:一个问题可能可以说比较会区分大小写:-(
用小写的一切工作将与帮助:

$pattern = strtolower('webmaster|admin|webadmin|sysadmin'); // just to be sure ;-) 
$forbidden_words = explode('|', $pattern); 

$word = 'aDMin'; 
if (in_array(strtolower($word), $forbidden_words)) { 
    echo "<p>$word is not OK</p>"; 
} else { 
    echo "<p>$word is OK</p>"; 
} 

会得到你:

aDMin is not OK 

(我看到了正则表达式的“i”标志只发布我的回答后,所以,不得不对其进行编辑)


编辑2:,如果你真的想用正则表达式来做到这一点,你需要知道:

  • ^标志着开始字符串
  • $标记字符串的结尾

那么,什么LIK E本应该做的:

$pattern = 'webmaster|admin|webadmin|sysadmin'; 

$word = 'admin'; 
if (preg_match('#^(' . $pattern . ')$#i', $word)) { 
    echo "<p>$word is not OK</p>"; 
} else { 
    echo "<p>$word is OK</p>"; 
} 

$word = 'admin2'; 
if (preg_match('#^(' . $pattern . ')$#i', $word)) { 
    echo "<p>$word is not OK</p>"; 
} else { 
    echo "<p>$word is OK</p>"; 
} 

括号可能是没有必要的,但我喜欢使用它们,隔离我想要的东西。

而且,你会得到相同的输出类型:

admin is not OK 

admin2 is OK 

你可能不希望使用[]:他们的意思是“这是我们之间的任何字符”,而不是“我们之间的整个弦“。

而作为参考:手册的preg syntax ;-)

+0

大土豆!这是一个翔实的答复,我会检查你说的reg-exp。在阵列当然是一个非常有效的建议来考虑。再次感谢马丁! – Coreus

+0

不客气:-)玩得开心! –

+0

作为旁注:在nick上使用strtolower也很有用,可以控制控制。 – Coreus

0

所以,禁止的话可以是部分他们的用户名,但不是全部?

在.NET中,该模式将是:

Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$") 

的“^”字符串的开头匹配,“$”结尾相匹配,所以它的查找完全匹配的其中之一话。我对相应的PHP语法有些模糊。