ng-паттерн для PCRE

У меня есть этот шаблон для текстового поля ввода: /[\p{L}\'.\- ]{3,30}/ Мое намерение состоит в том, чтобы принять наиболее широко имена людей в нескольких алфавитах мира (латиница, кириллица, китайский и т. д.). Он был протестирован в Regex101 и отлично работает. На других тестерах не работает, но моя основная проблема заключается в следующем:

<form action="mailto:[email protected]" 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>

Проблема в том, что при тестировании я пишу только буквы (без пробелов и дефисов, потому что все это необязательно) и все равно выдаю мне сообщение об ошибке. Почему?

Может быть, потому что я использую \p{L}, и это будет работать только на сервере, когда я кодирую проверку сервера на PHP?


person limakid    schedule 15.04.2021    source источник
comment
Попробуйте ng-pattern="/^[\p{L}'. -]{3,30}$/u", и я предлагаю добавить ng-trim="false".   -  person Wiktor Stribiżew    schedule 15.04.2021
comment
@WiktorStribiżew, спасибо, он отлично работает в html-форме (которая сохраняется как php). Тем не менее, он по-прежнему принимает много пробелов в начале. Например, я хочу разрешить пробелы между именем или фамилией, но не лишние пробелы в начале. Должен ли я лучше реализовать это на сервере, используя функцию обрезки PHP? Я не совсем понял, что именно ng-trim="false" будет работать. Я просто знал, что он не будет автоматически обрезать пробелы, но я не нашел видео с четким объяснением.   -  person limakid    schedule 15.04.2021
comment
Если вы не хотите допускать пробелы в начале и конце, вам нужно ng-pattern="/^\p{L}[\p{L}'. -]{1,28}\p{L}$/u" ng-trim="false". Или, если вам нужно запретить последовательные пробелы и апострофы - ng-pattern="/^(?=.{3,30}$)\p{L}+(?:['. -]\p{L}+)*$/u" ng-trim="false"   -  person Wiktor Stribiżew    schedule 15.04.2021


Ответы (1)


Вы можете использовать

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

Обратите внимание на флаг u, он включает поддержку классов категорий (свойств) Unicode в JavaScript с поддержкой ECMAScript 2018+.

Кроме того, ng-trim="false" предотвратит обрезку пробелов перед передачей ввода в механизм регулярных выражений.

Регулярное выражение означает:

  • ^ - начало строки
  • (?=.{3,30}$) — строка должна содержать от 3 до 30 символов, кроме символов разрыва строки.
  • \p{L}+ - одна или несколько букв Юникода
  • (?:['.\s-]\p{L}+)* - zero or more repetitions of
    • ['.\s-] - a ', ., whitespace or -
    • \p{L}+ - одна или несколько букв Юникода
  • $ - конец строки.

См. демонстрацию регулярного выражения.

person Wiktor Stribiżew    schedule 15.04.2021