@Ysery

Добавление в контактную форму проверку на стоп слова?

Уважаемые специалисты.

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

<?php
require_once(rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/wp-load.php');

if(isset($_POST['submit'])):
    if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])):
        $secret = 'yyyyy';
        $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
        $responseData = json_decode($verifyResponse);
		
		$name = !empty($_POST['name'])?$_POST['name']:'';
		$email = !empty($_POST['email'])?$_POST['email']:'';
		$message = !empty($_POST['message'])?$_POST['message']:'';
		$useragent = $_SERVER['HTTP_USER_AGENT'];
		$comm_ip = get_ipaddress();
        if($responseData->success):
		
$badWords = array("плохое_слово1","плохое_слово2", "плохое_слово3");
$matches = array();
$matchFound = preg_match_all(
                "/\b(" . implode($badWords,"|") . ")\b/i", 
                $message, 
                $matches
              );

if ($matchFound) {
  $words = array_unique($matches[0]);
  foreach($words as $word) {
    echo "<li>" . $word . "</li>";
  }
  echo "</ul>";
}
		
			$to = 'mail@gmail.com';
			$subject = 'Сообщение';
			$htmlContent = "
				<h1>Данные отправителя:</h1>
				<p><b>Имя: </b>".$name."</p>
				<p><b>E-mail: </b>".$email."</p>
				<p><b>Сообщение: </b>".$message."</p>
			";
			$headers = "MIME-Version: 1.0" . "\r\n";
			$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
			$headers .= 'From:'.$name.' <'.$email.'>' . "\r\n";
			wp_mail($to,$subject,$htmlContent,$headers);
			
            $succMsg = 'Ваше сообщение успешно отправлено';
			$name = '';
			$email = '';
			$message = '';
        else:
            $errMsg = 'Ошибка проверки «Я не робот», попробуйте снова.';
        endif;
    else:
        $errMsg = 'Вы забыли поставить галочку, что вы не робот. Сообщение не было отправлено.';
    endif;
else:
    $errMsg = '';
    $succMsg = '';
	$name = '';
	$email = '';
	$message = '';
endif;
?>
<html>
    <head>
    </head>
    <body>
<h2>Контактная форма</h2>

        <?php if(!empty($errMsg)): ?><div class="errMsg"><?php echo $errMsg; ?></div><?php endif; ?>
        <?php if(!empty($succMsg)): ?><div class="succMsg"><?php echo $succMsg; ?></div><?php endif; ?>

			<form action="" method="POST">
				<input type="text" class="text" required="" value="<?php echo !empty($name)?$name:''; ?>" placeholder="Введите ваше имя" name="name" >
                <input type="email" class="text" required="" value="<?php echo !empty($email)?$email:''; ?>" placeholder="Укажите ваш E-mail адрес" name="email" >
                <textarea type="text" placeholder="Сообщение..." required="" name="message"><?php echo !empty($message)?$message:''; ?></textarea>
				<div class="g-recaptcha" data-sitekey="xxx"></div>
				<input type="submit" name="submit" class="submit" value="ОТПРАВИТЬ">
		
			</form>
  </body>
</html>


Я её дополнил кодом

$badWords = array("плохое_слово1","плохое_слово2");
$matches = array();
$matchFound = preg_match_all(
                "/\b(" . implode($badWords,"|") . ")\b/i", 
                $message, 
                $matches
              );

if ($matchFound) {
  $words = array_unique($matches[0]);
  foreach($words as $word) {
    echo "<li>" . $word . "</li>";
  }
  echo "</ul>";
}


Но что-то он игнорируется. Как будет правильно? И если можно, то как правильно выводить найденные плохие слова там же, где и выводятся errMsg и succMsg
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
glaphire
@glaphire Куратор тега PHP
PHP developer
<?php
$message = "плохое_слово1 xорошее
плохое_слово2";
$badWords = array("плохое_слово1","плохое_слово2");
$matches = array();
$matchFound = preg_match_all(
                "/(" . implode($badWords,"|") . ")/mui", 
                $message, 
                $matches
              );

if ($matchFound) {
  $words = array_unique($matches[0]);
  foreach($words as $word) {
    echo "<li>" . $word . "</li>";
  }
  echo "</ul>";
}

sandbox
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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