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

Почему не работают регулярные выражения в 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}$`

К сожалению, форма вообще не отправляется?

Подскажите, пожалуйста, как решить проблему.
  • Вопрос задан
  • 1226 просмотров
Подписаться 2 Простой 2 комментария
Решения вопроса 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();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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