Занесение в черный список слов, которые могут быть введены в базу данных MySQL через форму php с использованием регулярного выражения


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

$disallowedWords = array(
'list','of','bad','words'
);

foreach ($disallowedWords as $word) {
  if (preg_match("/\s+$word\s+/i", $entry)) {
    die('The word or phrase ' . $word . ' is not allowed...');
  }
}

$urlRegex = '(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*';
if (preg_match($urlRegex, $entry)) {
  die('The word or phrase ' . $word . ' is not allowed...');

} 

Это работает для предложений, подобных этому:

Вот список

Это остановило бы сообщение и сказало, что список слов запрещен, однако, если я поставлю:

Вот список

Или

Вот список

Это не работает, так как (если это даже возможно) могу ли я подвергнуть цензуре это точное сочетание букв? Или что-то еще, что сработало бы так, что я не смог бы ввести "listt" или "alist" и т. Д.

Author: skaffman, 2011-10-17

3 answers

Удаление двух экземпляров '\s+' из вашего регулярного выражения сделает то, о чем вы просите, но также внесет в черный список любое (потенциально допустимое) слово, содержащее "плохое слово"

 0
Author: hair raisin, 2011-10-17 19:30:35

Использование \b$word\b вместо \s$word\s также будет соответствовать словам, окруженным пунктуацией, или началу/концу строки. (Технически \b - это утверждение нулевой ширины , которое соответствует границе между словесными и несловесными символами.)

Конечно, это все равно не решит проблему Сканторпа.

 1
Author: Ilmari Karonen, 2011-10-17 19:40:17

Вы бы хотели убрать \s+ с каждой стороны вашего запроса регулярного выражения.

Кстати, почему бы вместо этого не использовать strpos()?

Http://php.net/manual/en/function.strpos.php

Или еще лучше, вместо того, чтобы останавливать их, если найдено слово из черного списка, просто замените каждое слово из черного списка на **** или что-то в этом роде.

 0
Author: dqhendricks, 2011-10-17 19:17:25