ng-pattern with regex having double quotes does not escape correctly

后端 未结 3 1416
后悔当初
后悔当初 2021-01-18 20:36

I have a ng-pattern validation for a regex of ^[^\\./:*\\?\\\"<>\\|]{1}[^\\/:*\\?\\\"<>\\|]{0,254}$ which basically tests the invalid chars in filepath and teh limit.

相关标签:
3条回答
  • 2021-01-18 20:56

    First of all, your regex contains too many escaping symbols, while you only need to escape the " here and \\.

    Then, to match a " inside ng-pattern attribute, you may define it as \x22 or &quot;:

    var app = angular.module("app", []);
    <html ng-app="app">
    <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    </head>
    <body>
    <form name="form">
      <p>Enter text to validate:</p>
      <input type="text" ng-model="name" name="name" ng-pattern="/^[^\\\\./:*?&quot;<>|][^\\\\/:*?\x22<>|]{0,254}$/" ng-trim="false" />
      <div ng-show="form.name.$error.pattern">Text doesn't match with ng-pattern!</div>
    </form>
    </body>
    </html>

    You may also solve the problem by defining a regex in the controller with a regular string literal where you may use '.."..' or "..\"...", and then use the variable name inside {{...}} in the ng-pattern attribute. Note that to match a literal \ you need to use 4 backslashes in the regex pattern.

    var app = angular.module("app",[]);
    
    app.controller("FormCtrl", function($scope) {
      $scope.regex = "/^[^\\\\./:*?\"<>|][^\\\\/:*?\"<>|]{0,254}$/";
    });
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app">
        <form name="theForm" ng-controller="FormCtrl" novalidate>
            <input type="text" name="filename" placholder="filename" ng-model="filename" ng-pattern="{{regex}}" required />
            <div class="error"
                         ng-show="(theForm.filename.$dirty || attempted) && theForm.filename.$invalid">
                      <small class="error text-danger"
                             ng-show="theForm.filename.$error.required">
                        Please enter a file name.
                      </small>
                      <small class="error text-danger"
                             ng-show="theForm.filename.$error.pattern">
                        Please enter a valid file name.
                      </small>
                    </div>
        </form>
    </div>

    0 讨论(0)
  • 2021-01-18 21:00

    I was trying to exclude ' and " in a ng-pattern which is similar to the problem above. I found a way to embed ' or " directly without having to use a scope variable:

    <input type="text" ng-pattern="/^[^&#34&#39]+$/" />

    0 讨论(0)
  • 2021-01-18 21:10

    You can use \&quot; to escape ".

    0 讨论(0)
提交回复
热议问题