使用preg_match禁用某些字符

时间:2015-09-12 06:10:12

标签: php preg-match

我的注册页面有问题,我注意到人们可以注册alt代码,例如“ªμ쪔,我试图通过使用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))

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

1 个答案:

答案 0 :(得分:1)

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

事实上,正则表达式中可能有两件事:

  • 它可以断言主题的开始,这是你可能想要的。
  • 它可能会否定课程,这是您在代码中所做的事情。

来源: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);
}