使用 preg_match 禁用某些字符

Disabling some characters with preg_match

我的注册页面有问题,我注意到人们可以使用类似“ªµµª” 的替代代码注册,我尝试使用 preg_replace 但是当我这样做时,我不能再注册了,至少不能使用全球字母表

    final public function validName($username)  
{
    if(strlen($username) <= 25 && ctype_alnum($username))   
    {           
        return true;        
    }               

    return false;   
}       

尝试用这个替换它来修复它

if(strlen($username) <= 25 && preg_match("/[^a-zA-Z0-9]+/", $username))

但我显然做错了什么...

显然,您混淆了插入符 (^) 元字符的两种不同用法。

的确,正则表达式中可能是两件事:

  • 它可能会断言主题的开头,这可能是您想要的。
  • 它可能会否定 class,这就是您在代码中所做的。

来源:http://php.net/manual/en/regexp.reference.meta.php

这是您的代码的修改版本,使用脱字符 (^) 和美元 ($) 符号来断言您正在分析的字符串的开始和结束:

function validName($username)  
{
    if (strlen($username) <= 25 && preg_match("/^[a-zA-Z0-9]+$/", $username))   
    {           
        return true;        
    }               

    return false;   
}     

$names = array(
  'Abc1',
  'Abc$',
  "ªµµª"
);

foreach ($names as $name) {
  echo "<br>" . $name . ': ' . (validName($name) ? 'valid' : 'invalid');
}

// -- Returns: 
// Abc1: valid
// Abc$: invalid
// ªµµª: invalid

请注意,您可以将函数内的代码缩减为一行:

function validName($username)  
{
    return strlen($username) <= 25 && preg_match("/^[a-zA-Z0-9]+$/", $username);
}