【问题标题】:find occurence of a set of words找到一组单词的出现
【发布时间】:2009-08-05 17:48:18
【问题描述】:

我有一个模式,其中包含一个小的单词列表,这些单词非法用作在模式变量中设置的昵称,如下所示:

$pattern = webmaster|admin|webadmin|sysadmin

使用preg_match,如何实现禁止使用这些词的昵称,但允许注册“admin2”或“thesysadmin”之类的昵称?

这是我目前的表达方式:

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

// 不应该被允许

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

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    完全不使用正则表达式会怎样?
    与explode 和in_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:,如果你真的想用正则表达式来做,你需要知道:

    • ^ 标记字符串的开头
    • 和$ 标记字符串的结尾

    所以,应该这样做:

    $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 的手册 ;-)

    【讨论】:

    • 大土豆!这是一个内容丰富的回复,我会检查你所说的正则表达式。 in 数组当然是一个非常有效的建议。再次感谢马丁!
    • 附带说明:在 nick 上也可以使用 strtolower 来控制控件。
    • 括号是必需的。没有它们,锚点(^ 和$)将分别“粘”到列表中的第一个和最后一个单词。在所有正则表达式运算符中,交替 ('|') 的优先级最低。
    【解决方案2】:

    那么,禁用词可以是用户名的一部分,而不是全部?

    在 .NET 中,模式为:

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

    “^”匹配字符串的开头,“$”匹配结尾,因此它正在寻找其中一个单词的完全匹配。我对相应的 PHP 语法有点模糊。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2012-05-13
      • 2022-07-07
      相关资源
      最近更新 更多