客户端验证不支持使用 Unicode 的 ASP.NET MVC 正则表达式验证

Mor*_*lus 5 regex asp.net-mvc validationattribute unobtrusive-validation

我想验证一个给定的字符串,该字符串将用于在服务器中保存具有所需名称的文件。

这要求我使用以下 REGEX:^[\p\w\-. ]+$ 效果很好,但仅适用于英文字符串。

所以我像这样修改^[\p{L}\w\-. ]+${L}修改器设置为接受任何 Unicode 字符。

这是视图模型。

[Required(ErrorMessageResourceType = typeof(FilesRepositoryStrings), ErrorMessageResourceName = "EnterTheNamePlease")]
[Display(ResourceType = typeof(FilesRepositoryStrings), Name = "FileNameInputLabel")]
[RegularExpression(@"^[\p{L}\w\-. ]+$", ErrorMessage = @"The file name can only contain letters, numbers and characters -_.")]
public string FileName { get; set; }
Run Code Online (Sandbox Code Playgroud)

这是 html 渲染

<input class="form-control" data-val="true"
data-val-regex="The file name can only contain letters, numbers and characters -_." 
data-val-regex-pattern="^[\p{L}\w\-. ]+$" 
data-val-required="??? ?? ??? ?????" 
id="UploadFileModel_FileName" 
name="UploadFileModel.FileName" 
onkeyup="$('#EnterTheNamePlease').attr('hidden', true);" 
type="text" value="" 
aria-required="true" aria-invalid="true">
Run Code Online (Sandbox Code Playgroud)

但客户端验证不接受任何 Unicode(希伯来语)字符串..

有什么方法可以克服这个问题?

Fab*_*ian 0

您可以使用/u 标志激活 Javascript RegExp 中的 Unicode 支持。它是 ECMAScript6 的一部分,但根据此表,主要浏览器尚不支持它。

这很 hacky,但您可以做的是将客户端验证替换为自定义正则表达式引擎(如XRegexp )。它支持unicode 字符。在他们的示例中,它们使用简写符号\pL,但\p{L}也受支持(根据此,Unicode 类别一章)。

我还没有完全测试过,它可能有副作用。但我认为你可以做的是替换文件 jquery.validate.unobtrusive.js 中的 RegExp 匹配

match = new RegExp(params).exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
Run Code Online (Sandbox Code Playgroud)

经过

var unicodeWord = XRegExp(params);
return unicodeWord.test(value);
Run Code Online (Sandbox Code Playgroud)

您需要包含这些文件才能使其正常工作:

<script src="src/xregexp.js"></script>
<script src="src/addons/unicode-base.js"></script>
<script src="src/addons/unicode-categories.js"></script>
<script src="src/addons/unicode-scripts.js"></script>
Run Code Online (Sandbox Code Playgroud)

当然,当 jquery validate 发展时,维护会很困难,但它可能是一个解决方案。