10

我想验证用户输入的密码是否符合以下条件:

密码长度至少为 8 个字符,并应包含一个数字、一个字符和一个特殊字符。

为此,我使用了以下正则表达式:

^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$

我在我的 angularjs 代码中尝试了这个表达式,如下所示:

<md-input-container class="md-block" style="margin-top:0px;">
            <label>Password</label> <md-icon
                md-svg-src="/images/icons/ic_lock_black_24px.svg" class="name"></md-icon>
            <input type="password" ng-model="newUser.userPassword"
                name="userPassword" required 
                ng-pattern="^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$">
            <div
                ng-messages="registerForm.userPassword.$error">
                <div ng-message="pattern">Password should be atleast 8 characters long
                    and should contain one number,one character and one special
                    character</div>
                <div ng-message="required">Password should be atleast 8 characters
                    long and should contain one number,one character and one special
                    character</div>
            </div>
            </md-input-container>

在我上面的代码中,当密码字段为空白且焦点丢失时,将显示错误消息。如果用户输入的密码不满足我提到的标准,则不会显示错误消息。

我应该如何解决这个问题?有人请帮助我。

4

4 回答 4

18

据我了解你的问题。检查您的控制台它可能会因词法错误而损坏。

您忘记slash了 ng-pattern 的开头和结尾。请用ng-pattern="/^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$/"

我创建了一个可以帮助你的 plunk。 https://plnkr.co/edit/qCjp6a?p=preview

于 2016-04-01T09:47:24.243 回答
3

我使用 Angular 的内置模式验证器对此进行了尝试,并能够提出以下检查:

  • 长度至少为 8 个字符
  • 小写字母
  • 大写字母
  • 数字特殊字符

    password: [ '', [ Validators.required, Validators.pattern('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&].{8,}') ] ]

我要补充一点,我绝不是正则表达式专家。对于与 OP 密切相关的案例,这只是对我有用的方法。也许它会帮助别人。Mozilla 的文档在解决这个问题方面提供了很多帮助,特别是编写正则表达式模式部分。

于 2019-11-29T13:12:33.183 回答
2

只是几个笔记

1)上面包含一个多余的$。它应该是ng-pattern="/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/"

2)不要删除前导^和尾随$,因为它可以防止进入空格

3)如果你想在控制器中定义模式,那么

$scope.passwordStrength = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/;<input ng-pattern="passwordStrength">

但从不

$scope.passwordStrength = "/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/";

因为模式是RegExp对象,而不是字符串。

希望这可以帮助您节省一些时间。

于 2016-11-02T13:33:32.383 回答
1

您可以使用此正则表达式模式,它可以正常工作:

"/^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$/".

但是您需要将其写入.ts文件(控制器类),因为如果您在.html文件中写入正则表达式,因为输入字段的“类型”“密码”,您将始终抛出错误“密码无效”。因为您正在编写一个正则表达式来检查字母数字和特殊字符输入,但是由于输入字段的类型是密码,所以这个正则表达式将检查加密输入,这将始终失败。

于 2020-07-09T18:35:14.590 回答