Задать вопрос

Почему не работают регулярные выражения в AjaxForm?

Скликивают рекламу, переходя по ней, и заполняя в форме обратной связи "Заказать звонок" несуществующие номера.

В начале я сделал ограничения в форме: чтобы отправка разрешалась только если в поле "Номер" будет 17 символов (сам российский номер и разные пробелы и скобки).

Спама стало меньше. Но он не перестал приходить. Спамер теперь вводит все 11 цифр российского номера, но ставит после +7 цифры, которые в России не используются.

В РФ после цифры +7 могут идти цифры: 9, 4, 8, 3. Спамер же вводит цифры: 1, 2, 5, 6, 7, 0. Т.е. телефон получается такого вида:

+7 (333) 873 45 45 (недействительный)

Видимо, не хочет спамить существующими номерами, чтобы избежать лишних проблем.

Я пытался исправить ситуацию с помощью регулярок.

Вот моя форма:

[[!AjaxForm? 
			&form=`tpl.AjaxForm-modphone` 
			&snippet=`FormIt` 
			&hooks=`validate,modB24CRM,rcv3,email,`
			&modB24CRMHook=`form-modphone2`
			&emailSubject=`Заказ звонка с сайта`
			&emailTo=`[[++all_email]]`
			&emailFrom=`info@pochta.ru`
			&emailTpl=`contaktTpl-modphone`
			&validate=`tel:required:minLength=^17^`
			&validationErrorMessage=`В форме содержатся ошибки!`
			&successMessage=`Спасибо, ваша заявка принята.`			
		]]

Я пытался к элементу &validate=`tel:required:minLength=^17^` добавить следующие регулярные выражения:

&validate=`tel:required:minLength=^17^:regexp=^\+7\s*\(?[3489]`

&validate=`tel:required:minLength=^17^:regexp=^\+7\s\(([3489])\d{2}\)`

&validate=`tel:required:minLength=^17^:regexp=^\+7\s\(([3489])\d{2}\)\s\d{3}\s\d{4}$`

Форма вообще не отправляется.

Как решить проблему?
  • Вопрос задан
  • 1258 просмотров
Подписаться 2 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия DevOps-инженер + ИИ
    5 месяцев
    Далее
Решения вопроса 1
@dodo512
В документации FormIt пример регулярки выглядит так regexp=^/[0-9]{4}/^

В итоге должно быть regexp=^/\+7\s*\(?[3489]/^
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
DanArst
@DanArst
Гриффиндор в моде при любой погоде!
Напиши хук и проверяй там. Тем более раз ты уверен, что у тебя не бот, а человек спамит. То возвращай ему сообщение, что форма отправилась, но на деле завершай выполнение скрипта;
<?php
$phone = preg_replace('/[\s\-\(\)]/', '', $hook->getValue('phone'));

if (preg_match('/^\+7[9483]\d{9}$/', $phone )) {
    return true;
} else {
    echo $AjaxForm->success('Ваше сообщение отправлено');
    die();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы