PCRE 的 ng 模式

问题描述

我有一个输入文本字段的模式:/[\p{L}\'.\- ]{3,30}/ 我的目的是接受世界上几个字母表(拉丁文、cirilicm 中文等)中最广泛的人名。它在 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 它跳过特殊字符,跳过符号,跳过数字,但是当我在浏览器中看到 live html 时,它无法正常工作。

错误消息中,为了验证目的,我输入:

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

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

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

解决方法

你可以使用

<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-] - '.、空格或 -
    • \p{L}+ - 一个或多个 Unicode 字母
  • $ - 字符串结束。

参见regex demo