Шаблон ng с регулярным выражением, имеющим двойные кавычки, не корректно экранируется
У меня есть проверка ng-шаблона для регулярного выражения ^[^\./:*\?\"<>\|]{1}[^\/:*\?\"<>\|]{0,254}$ который в основном проверяет недопустимые символы в filepath и teh limit. но когда у меня есть ng-шаблон, указанный как
ng-pattern = "^[^\\\./:\*\?\"<>\|]{1}[^\\/:\*\?\"<>\|]{0,254}$"
шаблон ng неверно показывает регулярное выражение. любая помощь в достижении этого правильно
3 ответа
Прежде всего, ваше регулярное выражение содержит слишком много экранирующих символов, в то время как вам нужно только избежать "
здесь и \\
,
Затем, чтобы соответствовать "
внутри ng-pattern
атрибут, вы можете определить его как \x22
или же "
:
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="/^[^\\\\./:*?"<>|][^\\\\/:*?\x22<>|]{0,254}$/" ng-trim="false" />
<div ng-show="form.name.$error.pattern">Text doesn't match with ng-pattern!</div>
</form>
</body>
</html>
Вы также можете решить эту проблему, задав регулярное выражение в контроллере с помощью обычного строкового литерала, где вы можете использовать '.."..'
или же "..\"..."
, а затем использовать имя переменной внутри {{...}}
в ng-pattern
приписывать. Обратите внимание, чтобы соответствовать буквальному \
вам нужно использовать 4 обратных слеша в шаблоне регулярных выражений.
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>
Я пытался исключить "и" в ng-шаблоне, который похож на проблему выше. Я нашел способ встраивать "или" напрямую, без использования переменной области видимости:
<input type="text" ng-pattern="/^[^"']+$/" />