如何防止用户在文本框中输入特殊字符

本文关键字:输入 特殊字符 文本 何防止 用户 | 更新日期: 2023-09-27 18:16:43

我需要验证一个文本框上的密码输入,我有几个要求来完成,以便允许创建用户配置文件,其中一个是拒绝注册,如果密码包含任何其他不同于数字和字母表的系统需要拒绝输入,我尝试的一切似乎都失败了。这就是我现在所站的位置:

     private void BUT_Signup_Click(object sender, EventArgs e)
    {
     string allowedchar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    if (!(TXT_NewPassword.Text.ToString().Contains(allowedchar)))
                    MessageBox.Show("No special characters on the password are allowed");

如何防止用户在文本框中输入特殊字符

你可以使用LINQ:

if (!TXT_NewPassword.Text.All(allowedchar.Contains))
{
    // Not allowed char detected
}

另一个建议,其他人已经提到,但没有证明。

正则表达式也可以实现这一点。

private void button1_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(textBox1.Text))
    {
        MessageBox.Show("Invalid password. Password cannot be empty.");
        return;
    }
    System.Text.RegularExpressions.Regex regex = null;
    regex = new System.Text.RegularExpressions.Regex("^([a-zA-Z0-9])*$");
    if (regex.IsMatch(textBox1.Text))
    {
        MessageBox.Show("Valid password.");
    }
    else
    {
        MessageBox.Show("Invalid password. Password cannot contain any special characters.");
    }
}

这将总是失败,因为您告诉它如果包含的字符都不有效就会失败。你想要的不是你的。contains (allowedchar),而是像…

if( TXT_NewPassword.Text.ToString().Any(ch => bannedChars.Contains(ch)))
{
   MessageBox.Show("No special blah blah blah");
}

bannedChars是所有不允许的字符的集合。它将遍历密码中的每个字符,并在bannedChars列表中显示消息框。

你可能可以用Regex做一些更整洁的事情,但我不想再花一整天的时间去研究Regex是如何工作的,所以这是你能从我这里得到的最好的。

您正在测试密码是否包含整个 allowedchar字符串。您必须反过来做,您需要测试密码中的每个字符是否包含在allowedchars中。

下面是带有解决方案思想的伪代码(不是c#,但希望你能意识到你需要做什么):

    String password = myTextbox.Text;
    foreach ( Char s in password ) 
        if ( !allowedchar.contains(s) )
            MessageBox.Show("No special characters on the password are allowed");

为什么不控制这个呢?

    private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        if (e.KeyChar == (Char)Keys.Back || !allowedChar.Any(chr => chr == e.KeyChar))
        {
            e.Handled = true;
            return;
        }
        e.Handled = false;
    }

又一个建议…

更新:

理论上,这现在可以处理用户传递他们想要的密码,但现在包括上面的首选答案。发生一次将比这种方法发生在每次KeyPress更有效。