Как искать строку по регулярному выражению в массиве? Здравствуйте!
Есть сайт на Drupal 7, на сайте несколько форм обратной связи, с которой приходит тонна хлама. Пытались ставить готовые антиспам-модули - эффекта не дало.
Хочу попробовать фильтровать спам по неправдоподобным именам (в поле "Ваше имя:" написана белиберда на латинице) непосредственно перед отправкой на почту.
Нашел в модуле функцию, отвечающую за отправку$message = drupal_mail('webform', 'submission', $address, $language, $mail_params, $email['from']);
if ($message['result']) {
$send_count += $send_increment;
}
Как обернуть её в проверку по отправляемому на email тексту?
Искать придётся строку, состоящую из "Ваше имя: " и рандомных латинских букв;
Искать среди значений массива $mail_params.
Я попытался так: если в массиве не встречается строка "Ваше имя: wsdfSDFASds", то отправляем письмоif (!array_search(preg_grep('/Ваше имя: ([A-Za-z])*/', $mail_params))){
$message = drupal_mail('webform', 'submission', $address, $language, $mail_params, $email['from']);
if ($message['result']) {
$send_count += $send_increment;
}
}
Но или неверно составил регулярное выражение, или неверно построил сам код; в общем, это решение не работает.

21 Авг 2019 в 06:24
233 +1
0
Ответы
1

Для поиска строки по регулярному выражению в массиве $mail_params вам нужно использовать функцию preg_match. Вот как можно модифицировать ваш код:

foreach ($mail_params as $param) {
if (preg_match('/Ваше имя: [A-Za-z]+/', $param)) {
$message = drupal_mail('webform', 'submission', $address, $language, $mail_params, $email['from']);
if ($message['result']) {
$send_count += $send_increment;
break; // прерываем цикл после отправки письма
}
}
}

Этот код пройдет по каждому элементу массива $mail_params и выполнит проверку на соответствие регулярному выражению '/Ваше имя: [A-Za-z]+/'. Если такая строка найдена, письмо будет отправлено. Также добавлена инструкция break для прерывания цикла после успешной отправки письма.

Если вы хотите проверить именно отсутствие строки, можно использовать оператор ! перед preg_match:

foreach ($mail_params as $param) {
if (!preg_match('/Ваше имя: [A-Za-z]+/', $param)) {
$message = drupal_mail('webform', 'submission', $address, $language, $mail_params, $email['from']);
if ($message['result']) {
$send_count += $send_increment;
break;
}
}
}

Надеюсь, это поможет вам фильтровать спам по неправдоподобным именам перед отправкой на почту.

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир