У меня есть новая функция на моем сайте, где пользователи могут отправлять любой текст (я остановил все записи HTML) через текстовое поле. Основная проблема, которая у меня есть, заключается в том, что они могут набирать «http://somewhere.com», что я хочу остановить. Я также хочу, чтобы черный список конкретных слов. Это то, что я имел раньше:
if (strpos($entry, "http://" or ".com" or ".net" or "www." or ".org" or ".co.uk" or "https://") !== true) { die ('Entries cannot contain links!');
Однако это не сработало, так как оно не позволяло пользователям отправлять какой-либо текст вообще. Поэтому мой вопрос прост, как я могу это сделать?
Это работа для регулярных выражений .
Что вам нужно сделать это примерно так:
// A list of words you don't allow $disallowedWords = array( 'these', 'words', 'are', 'not', 'allowed' ); // Search for disallowed words. // The Regex used here should eg match 'are', but not match 'care' or 'stare' foreach ($disallowedWords as $word) { if (preg_match("/\s+$word\s+/i", $entry)) { die("The word '$word' is not allowed..."); } } // This variable should contain a regex that will match URLs // there are thousands out there, take your pick. I have just // used an arbitrary one I found with Google $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\.\,\?\'\\\+&%\$#\=~_\-]+))*'; // Search for URLs if (preg_match($urlRegex, $entry)) { die("URLs are not allowed..."); }
Вы должны использовать strpos больше один раз. По пути вы оцениваете оператор or с возвратом true / false и передаете его strpos.
Таким образом, он должен работать:
if (strpos($entry, "http://") !== false || strpos($entry, "https://") !== false || strpos($entry, ".com") !== false)
Простой способ сделать это – положить все слова, которые не разрешены в массив, и прокрутить их, чтобы проверить их.
$banned = array('http://', '.com', '.net', 'www.', '.org'); // Add more foreach ($banned as $word): if (strpos($entry, $word) !== false) die('Contains banned word'); endforeach;
Проблема в том, что если вы слишком увлечены и начинаете запрещать слово «ком» или что-то еще, есть другие слова и фразы, которые могут быть совершенно законными, которые содержат буквы «com» таким образом, что может привести к ложному положительному результату. Вы можете использовать регулярные выражения для поиска строк, которые выглядят как URL-адреса, но тогда вы можете легко разбить их, как я сделал выше. Не существует эффективного способа полностью остановить людей от публикации ссылок в комментарии. Если вы не хотите их там, вам в конечном итоге просто придется использовать умеренность. Модерация сообщества работает очень хорошо, например, посмотрите на Stack Overflow .