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

Posted

技术标签:

【中文标题】如何防止用户在文本框中输入特殊字符[重复]【英文标题】:How to prevent users from typing special characters in textbox [duplicate] 【发布时间】:2016-01-06 05:22:13 【问题描述】:

我需要验证文本框上的密码条目,我有一些要求要完成以允许创建用户配置文件,其中之一是如果密码包含与数字和数字不同的任何其他内容,则拒绝注册系统需要拒绝输入的字母,我尝试的一切似乎都失败了。 这是我现在的位置:

     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");

【问题讨论】:

仅供参考,TextBoxText 属性是string。您无需致电myTextbox.Text.ToString()。这是多余的。 【参考方案1】:

你可以使用 LINQ:

if (!TXT_NewPassword.Text.All(allowedchar.Contains))

    // Not allowed char detected

【讨论】:

嘿,有趣!你能解释一下 All 方法的作用吗?谢谢! @ElMarce Enumerable.All<TSource> Method 或更具可读性的 TXT_NewPassword.Text.All(x=>allowedchar.Contains(x)) +1 谢谢你的回答! 谢谢!你为我节省了很多工作......非常感谢!【参考方案2】:

其他人提到但未展示的另一个建议。

正则表达式也可以做到这一点。

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.");
    

【讨论】:

【参考方案3】:

这总是会失败,因为如果包含的所有字符都不是有效的,你会告诉它失败。你想要什么而不是你的 .Contains(allowedchar) 是......

if( TXT_NewPassword.Text.ToString().Any(ch => bannedChars.Contains(ch)))

   MessageBox.Show("No special blah blah blah");

bannedChars 是所有不允许使用的字符的集合。这将遍历密码中的每个字符,并显示消息框(如果其中任何一个在禁止字符列表中)。

您可能可以使用 Regex 做一些更简洁的事情,但我不想花一整天的时间来查找 Regex 的工作原理,所以这是您能从我这里得到的最好的。

【讨论】:

指定不允许的字符列表而不是允许的字符列表是非常不合逻辑的。试想一下,在 16 位字符长度上验证 65536 个可能的字符。更不用说这将是一场悲剧表演。 嗯,这取决于你允许或不允许什么,你假设人们总是想禁止大多数字符是非常不合逻辑的。不需要脑外科医生将其从禁止转换为允许,我认为提出这些问题的人至少能够隐约解决问题。还值得一提的是,该问题特别指出它是为了防止用户输入“特殊”字符,如果它们很特殊,则应该定义它们,而不是所有其他字符。基本上我的意思是你错了瓦肯先生。【参考方案4】:

您正在测试密码是否包含 整个 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");

【讨论】:

【参考方案5】:

为什么不控制这个而不是事后检查?

    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 上发生一次会比这种方法更有效。

【讨论】:

用户可能会粘贴到字段中,所以我认为签入TextChanged 或在需要检查时进行检查是更好的解决方案。 我忘记了这一点,你是绝对正确的@RezaAghaei 考虑一下,采用这种方法并涵盖所有可能性可能会变得丑陋并且难以维护。

以上是关于如何防止用户在文本框中输入特殊字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

过滤网址和输入框中的特殊字符,防止sql注入

防止在文本框中输入非 ascii 字符

Regex-如何防止重复的特殊字符?

如何防止写入特殊字符[重复]

java如何转换富文本框中的中文编码格式,且把标签变成特殊字符

如何限制材料输入中的特殊字符