使用javascript,php完成表单验证

时间:2014-09-19 06:57:45

标签: javascript html regex

我正在尝试使用带有函数的正则表达式来验证密码,但它对我不起作用。任何人都可以看看缺少什么或我犯了什么错误。?

这是我的代码:



 function passCheck() {
    var passexp = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/;
    var password = document.getElementById("password");
    
    if (password != "") {
        if (!password.match(passexp)) {
            document.registration.password.focus();
            document.getElementById('error2').innerHTML = "Password should be atleast 8 character long and must contain at least one digit,at least one lower case,at least one upper case.";
            return false;
        } else {
            document.getElementById('error2').innerHTML = "";
            return true;
        }
    } else {
        document.registration.password.focus();
        document.getElementById('error2').innerHTML = "Password can't be blank";
        return true;
    }
}

<label for="password">* Password </label>
<input type="password" name="password" placeholder="Password should be atleast 8 characters" id="password" size="40" required="required" onblur="return passCheck();"/>
<span id="error2"></span>
&#13;
&#13;
&#13;   

修改

您好,

在同一表格中我还有其他几个字段(即姓名,电子邮件,密码,确认密码,用户名,手机号码,街道,城市,国家(选择标签),性别(单选按钮)。 现在我的问题是或者更确切地说是混淆:

  1. 我是否需要检查该字段是否为空(在客户端和服务器端),尽管使用了&#39; required&#39;属性

  2. 我为我想要验证的每个字段创建了新函数(就像passCheck()一样,它会使代码变得不必要。所以这里代码的可重用性没有完成。我还能用其他方式实现验证以实现它。它有点无聊,无法一次又一次地实现类似的逻辑或方法,只需稍作修改。

  3. Javascript变量的名称不能与包含该变量的函数名称相同。为什么? 因为当我尝试使用相同的名称时,代码并没有起作用。但当我在 jsfiddle.net 上检查相同的代码时,它显示该变量的错误。

  4. 对于非文本字段(选择框和单选按钮)使用PHP函数(如 mysql_real_escape_string())的目的是什么。在这里,我们不允许用户输入除已定义的选项之外的任何其他内容。

  5. 保持一个单选按钮检查性别是不错的做法。

  6. 我将性别存储在数据库中,作为存储男/女的第一个字符的CHAR(1)。 如何使用ENUM存储相同内容。

4 个答案:

答案 0 :(得分:2)

此:

var password = document.getElementById("password");

if (password != "") {

...将HTML密码输入分配给password变量,而不是该输入的值。 (password != "")始终为真,因为password不是字符串,而是表单元素。

请改为尝试:

var password = document.getElementById("password").value;

答案 1 :(得分:2)

以下是您可以尝试的regular expression

"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$"

上述regex将强制执行以下规则:

  1. 至少一个大写字母
  2. 至少一个小写字母
  3. 至少一位数
  4. 长度最少8个

    &#34;(?= [AZ])(?= [AZ])(?= \ d?)。^(= [ !?$ @ $%的&安培;])[A-ZA-Z \ d $ @ $%&安培;!?] {8,}&#34;

  5. 上述regex将强制执行以下规则:

    1. 至少一个大写字母
    2. 至少一个小写字母
    3. 至少一位数
    4. 一个特殊字符
    5. 最少8个长度
    6. 另请查看史蒂夫关于表格不起作用的答案。

答案 2 :(得分:1)

只需将正则表达式更改为

即可
^(?=.{8,})(?=.*?\d)(?=.*?[A-Z])(?=.*[a-z]).*?(?:(?!\s|\n)\W).*$

(?:(?!\s|\n)\W)确保一个字符必须是非单词字符,而不是空格或换行符。

DEMO

这不会在密码文本框中包含空格或换行符,

^(?=.{8,})(?=.*?\d)(?=.*?[A-Z])(?=.*[a-z])(?:(?!\s|\n)[\W\w])*$

DEMO

答案 3 :(得分:1)

您需要区分<input>元素及其包含的值。以下代码段包含对原始代码的一些更改。特别是,变量passwordValue包含<input>的文本内容,而passwordElement是输入本身。我还在.trim()中添加了一个输入是否为空的测试,因为这会在执行正则表达式匹配之前捕获仅包含空格的输入。

&#13;
&#13;
function passCheck() {
    var passexp = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/;
    var passwordElement = document.getElementById("password");
    var passwordValue = passwordElement.value;
    if (passwordValue.trim() !== "") {
        if (!passwordValue.match(passexp)) {
            passwordElement.focus();
            document.getElementById('error2').innerHTML = "Password should be atleast 8 character long and must contain at least one digit,at least one lower case,at least one upper case.";
            return false;
        } else {
            document.getElementById('error2').innerHTML = "";
            return true;
        }
    } else {
        passwordElement.focus();
        document.getElementById('error2').innerHTML = "Password can't be blank";
        return true;
    }
}
&#13;
<label for="password">* Password </label>
<input type="password" name="password" placeholder="Password should be atleast 8 characters" id="password" size="40" required="required" onblur="passCheck()"/>
<span id="error2"></span>
&#13;
&#13;
&#13;

正如您在有关!==运算符的评论中所述,这里有一些解释:

!==是与===相反的运算符,这意味着它在左侧和右侧之间进行了严格的比较。这意味着变量的类型以及值都很重要。例如,2 == "2"将评估为true,而2 === "2"将评估为false。通常认为使用严格比较是一种好习惯,因为它可以更有效地传达您想要做的事情。出于这个原因,我在您的代码中将!=更改为!==;它与修复问题没有直接关系。