2014-03-26 101 views
4

我们有一个正则表达式,我们用于电子邮件。我们的应用程序正在继承正则表达式,所以它可能不是一个选项来切换它......无论如何,同样的步骤似乎在浏览器中的JavaScript崩溃。我已经能够在IE和Chrome中重现,但不能重现Firefox。下面是代码:角度ng模式崩溃浏览器

var mod = angular.module("myApp", []); 

mod.controller("MainCtrl", function ($scope) { 
    //Pattern that blows up the browser during ng-pattern 
    $scope.emailPattern = /^(?!.*\.{2})([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+([\.][a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*)@((([\-]?[a-zA-Z0-9]){2,}[\.])*(([a-zA-Z0-9][\-]?){1,})+).(([\.]([a-zA-Z0-9][\-]?){2,}([a-zA-Z0-9])*)+)$/; 


}); 

HTML:

<div ng-app="myApp" ng-controller="MainCtrl"> 
    <form name="emailForm" novalidate> 
     <input type="text" ng-model="user.email" name="email" maxlength="80" required ng-pattern="emailPattern"> 
    </form> 
    <br> 
    {{user.email}} 
</div> 

Fiddle here。以下是导致浏览器崩溃的基本步骤:

  1. 在文本框中键入一串字母直到它已满(其他输入可能正常,但这是我用过的)。
  2. 退格2个字符。
  3. 击中首页键返回到输入的前面。
  4. 类型的字符:一个@

这将崩溃的IE和Chrome一致。有没有人遇到过这个bug?任何已知的解决方法?

+1

我能够重现。 –

+0

嗨我注意到ng-pattern的文档上它说:'* @param {string =} ngPattern如果该值与 * RegExp模式表达式不匹配,则设置'pattern'验证错误键。对于定义为范围表达式的 *模式,内联模式或“regexp”的预期值为'/ regexp /'。'。 也许你的问题是使用范围表达式和内联模式。 –

+1

当我将它用作范围表达式或内联表达式时,崩溃存在。使正则表达式“更简单”不会导致浏览器崩溃,但按原样验证正则表达式应该没有问题。 – Patrick

回答

5

我认为这个问题与正则表达式本身有关。

如果你去任何正则表达式验证器网站(如http://regexpal.com/),使用原始表达式,同样的问题会发生在那里(与浏览器冻结)。


变化:

$scope.emailPattern = /^(?!.*\.{2})([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+([\.][a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*)@((([\-]?[a-zA-Z0-9]){2,}[\.])*(([a-zA-Z0-9][\-]?){1,})+).(([\.]([a-zA-Z0-9][\-]?){2,}([a-zA-Z0-9])*)+)$/; 

要:

$scope.emailPattern = /^(?!.*\.{2})([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+([\.][a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*)@((([\-]?[a-zA-Z0-9]){2,}[\.])*(([a-zA-Z0-9][\-]?))+).(([\.]([a-zA-Z0-9][\-]?){2,}([a-zA-Z0-9])*)+)$/; 
+0

对引起过度回溯的不必要的量词很好的一套眼睛。 – Patrick

+0

@Zach你救了我的一天! –