Intereting Posts
Как удалить повторяющиеся данные объекта JSON с помощью PHP Слэш в почте HTML? Функция создания регулярных выражений, соответствующих диапазону чисел Почему я не мог назначить функцию wordpress переменной? Получить идентификатор видео Youtube из html-кода с помощью PHP Выбор метода кэширования PHP: выходное кэширование в кеширование файлов и операций Обнаруживать, разрешены ли cookie в PHP Форма всегда отправляется как GET даже с методом POST как определить максимальную стоимость маршрута в высокой числовой пирамиде Используйте AJAX для отображения генерируемого php изображения импортировать данные из csv в mysql, используя cakephp Что случилось с этим заявлением? Пакет php5 не имеет кандидата на установку (Ubuntu 16.04) Как отображать цену продукта с и без налога одновременно в списке продуктов для Prestashop? file_get_contents ('php: // input') продолжает возвращать пустое

Обнаружение определенных слов в представлении textarea

У меня есть новая функция на моем сайте, где пользователи могут отправлять любой текст (я остановил все записи 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 .