Как искать строку по регулярному выражению в массиве? Здравствуйте! Есть сайт на 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; } } Но или неверно составил регулярное выражение, или неверно построил сам код; в общем, это решение не работает.
Для поиска строки по регулярному выражению в массиве $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; } } }
Надеюсь, это поможет вам фильтровать спам по неправдоподобным именам перед отправкой на почту.
Для поиска строки по регулярному выражению в массиве $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;
}
}
}
Надеюсь, это поможет вам фильтровать спам по неправдоподобным именам перед отправкой на почту.