Почему регулярные выражения не функционируют в 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\(`
  • 26 апреля 2025 г. 12:45
Ответы на вопрос 2
Здравствуйте!

Проблема с использованием регулярных выражений в вашем случае может быть связана с тем, как вы настраиваете валидацию в AjaxForm. Давайте рассмотрим несколько важных моментов и предложим возможные решения.

### 1. Структура регулярных выражений

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

Попробуйте использовать следующую структуру регулярного выражения, чтобы учесть формат российских номеров:

```regex
^\+7\s*\(?[3489]\d{2}\)?\s*\d{3}\s*\d{2}\s*\d{2}$
```

Здесь мы:
- Начинаем с `^` и заканчиваем на `$` для указания начала и конца строки.
- Используем `\s*` для учета пробелов.
- Учитываем, что номер может содержать круглые скобки для кода региона. 
- Указываем, что после кода `+7` может следовать цифра, которая должна быть `3`, `4`, `8` или `9`.

### 2. Подключение регулярного выражения к валидации

Когда вы добавляете регулярное выражение к своему вызову AjaxForm, убедитесь, что вы правильно его синтаксически оформляете. Пример использования:

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

### 3. Проверка других частей кода

Если регулярное выражение по-прежнему не работает, проверьте следующее:

- Убедитесь, что вы не забыли про использование символов-экранировщиков, если это необходимо (например, `\` для экранирования).
- Проверьте, как именно обрабатываются ошибки валидации на стороне клиента и сервера. Возможно, у вас не прописаны хорошие сообщения об ошибках, и поэтому вы не видите, почему регулярное выражение не срабатывает.
- Убедитесь, что AjaxForm действительно использует валидацию, и что нет других обработчиков (например, JavaScript), которые могут вмешиваться в этот процесс.

### 4. Другие меры по уменьшению спама

Кроме валидации номера телефона, вы можете рассмотреть возможность внедрения:

- CAPTCHA или других форм проверки (например, reCAPTCHA), чтобы минимизировать автоматические отправки форм.
- Ограничение по IP-адресам.
- Использовать системы анализа на стороне сервера (например, проверку на существование номера через API).

Надеюсь, эти рекомендации понадобятся вам для успешного решения проблемы с формой обратной связи. Если у вас возникнут дополнительные вопросы, feel free to ask!
Напиши хук и проверяй там. Тем более раз ты уверен, что у тебя не бот, а человек спамит. То возвращай ему сообщение, что форма отправилась, но на деле завершай выполнение скрипта; 
<?php
$phone = preg_replace('/[\s\-\(\)]/', '', $hook->getValue('phone'));

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