1

我有一个输入文本字段的模式:/[\p{L}\'.\- ]{3,30}/我的目的是接受世界上几个字母表上最广泛的人名(拉丁文、中文等)。它在 Regex101 中进行了测试,效果很好。在其他测试仪上不起作用,但我的主要问题如下:

<form action="mailto:myemail@emailserver.com" id="formula" method="post" enctype="multipart/form-data" 
name="formname" class="form-group pt-3" autocomplete="on" ng-submit="register()" novalidate>
<input type="text" name="nombre" ng-pattern="/[\p{L}\'.\- ]{3,30}/">

我分享我的代码供您检查:https ://regex101.com/r/gOvO2M/8 它跳过特殊字符、跳过符号、跳过数字,但是当我在浏览器中看到实时 html 时,它不能正常工作.

在错误消息中,出于验证目的,我输入:

<p class="formu-error" ng-show="formname.nombre.$touched && formname.nombre.$invalid">Please, write a valid name.</p>

问题是在测试时,我只写字母(没有空格,没有连字符,因为所有这些都是可选的)并且仍然给 mem 错误消息。为什么?

也许是因为我正在使用\p{L}并且仅在服务器中有效,当我在 PHP 中编写服务器验证时?

4

1 回答 1

0

您可以使用

<input type="text" name="nombre" ng-pattern="/^(?=.{3,30}$)\p{L}+(?:['.\s-]\p{L}+)*$/u" ng-trim="false" />

请注意该u标志,它通过 ECMAScript 2018+ 支持启用 JavaScript 中的 Unicode 类别(属性)类支持。

此外,ng-trim="false"将防止在将输入传递给正则表达式引擎之前修剪空白。

正则表达式意味着:

  • ^- 字符串的开始
  • (?=.{3,30}$)- 字符串必须由 3 到 30 个字符组成,而不是换行符
  • \p{L}+- 一个或多个 Unicode 字母
  • (?:['.\s-]\p{L}+)*- 零次或多次重复
    • ['.\s-]- a ', ., 空格或-
    • \p{L}+- 一个或多个 Unicode 字母
  • $- 字符串结束。

请参阅正则表达式演示

于 2021-04-15T21:31:41.683 回答