Класс для замены/поиска чёрных сайтов

3.09K
.
The Fast, Secure and Professional - Yii2

И так, представляю маленький класс который представляет из себя черный список сайтов. Его свойство - замена или поиск запрещенных сайтов в тексте по маске.
Почти каждый владелец сайта на котором присутствуем возможность комментирования чего либо встречался с проблемой спама на его сайте. В некоторых движках организована сырая замена определенных сайтов на какой-то текст. Мой класс представляет почти тоже самое только с возможностью замены/поиска по маске. Что это значит?

Ну к примеру есть у нас на сайте который не доброжелатель который спамит свой сайт, для примера - sait.ru Подключив мой класс он не сможет использовать не один из перечисленных вариантов написания своего сайта в тексте.


http://sait.ru
https://sait.ru
sait.ru
sait,ru
sait_ru
sait .ru
sait. ru
sait-ru


И т.д. Маску вы сможете добавить сами.

Теперь перейдем к самому коду.

Представим, что переменная $text содержит текст введенный пользователем, который нам нужно очистить от запрещенных ссылок:

$text = 'Привет, заходи на мой сайт sait.ru';

$obj = new RBlackListSites();
$obj->sites = [
    [
        'host' => 'sait',
        'domain' => 'ru',
    ],
    [
        'host' => 'example',
        'domain' => 'com',
    ],
];
$obj->mask = [
    'http://{host}.{domain}',
    'https://{host}.{domain}',

    '{host}.{domain}',
    '{host},{domain}',
    '{host}_{domain}',
    '{host}-{domain}',

    '{host} .{domain}',
    '{host} ,{domain}',
    '{host} _{domain}',
    '{host} -{domain}',

    '{host} . {domain}',
    '{host} , {domain}',
    '{host} _ {domain}',
    '{host} - {domain}',

    '{host}. {domain}',
    '{host}, {domain}',
    '{host}_ {domain}',
    '{host}- {domain}',
];
$obj->replace = '***SPAM***';
$obj->setText($text);

echo $obj->getText();


Внимание!
$obj->setText($text) должен быть объявлен после указания $obj->sites и $obj->mask
Прикрепленные файлы:
.
The Fast, Secure and Professional - Yii2

Для джона можно создать функцию и вызывать её вместе с ББ-Кодами.

.
The Fast, Secure and Professional - Yii2

Это первый мой класс с документацией, да и вообще в пабл вроде не выкладывал классов. Так, что жду адекватной критики и советов.

.
The Fast, Secure and Professional - Yii2

Дальше можно будет запилить все это дело под джон, с добавлением ссылок и масок с БД

.
The Fast, Secure and Professional - Yii2

Забыл дописать к первому посту, что результатом будет "Привет, заходи на мой сайт ***SPAM***"

.
The Fast, Secure and Professional - Yii2

Сам класс

RBlackListSites (+/-)

<?php
/**
 * Класс для поска/замены всех возможных вариантов запрещённых сайтов
 * @author Rakovskiy Andrey <rakovskiy28@mail.ru>
 * @link http://vk.com/rakovskiy28
 * @version 1.0
 *
 *
 * Пример использования
 * <pre>
 *      $obj = new RBlackSites();
 *
 *      $obj->sites = [
 *          [
 *              'host' => 'google',
 *              'domain' => 'com',
 *          ],
 *          [
 *              'host' => 'youtube',
 *              'domain' => 'com',
 *          ],
 *      ];
 *
 *      $obj->mask = [
 *          'http://{host}.{domain}',
 *          'https://{host}.{domain}',
 *          '{host}.{domain}',
 *          '{host},{domain}',
 *          '{host}_{domain}',
 *      ];
 *
 *      $obj->replace = '***SPAM***';
 *      $obj->setText('Привет, заходи на мой сайт google.com');
 *
 *      echo $obj->getText();
 * </pre>
 *
 * В пиведенном выше примере сайты в тексте вида
 *
 * http://google.com
 * https://google.com
 * google.com
 * google,com
 * google_com
 *
 * будут заменены на ***SPAM***
 *
 * ВНИМАНИЕ!
 * $obj->setText($text) должен быть объявлен после указания $obj->sites и $obj->mask
 *
 * В данном классе есть метод для проверки наличия запрещённых сайтов в тексте
 * для этого используется метод $obj->has()
 */

class RBlackListSites {

    /**
     * @var array Список запрещённых сайтов
     */
    public $sites = [];

    /**
     * @var array Варианы замены запрещённых сайтов
     */
    public $mask = [];

    /**
     * @var string На что будем заменять сайт
     */
    public $replace;

    /**
     * @var array Массив со всеми возможными вариантами замены для каждого сайта
     */
    private $arraySites = [];

    /**
     * @var string Исходный текст который подлежит дальнейшей проверки/замены запрещённых сайтов
     */
    private $text;

    /**
     * @param string $text Текст для поиска/замены запрещённых сайтов
     */
    public function setText($text){
        $this->arraySites = $this->arraySites();
        $this->text = $text;
    }

    /**
     * Возвращает форматированный от запрещённых сайтов текст
     * @return string
     */
    public function getText()
    {
        return str_ireplace(array_keys($this->arraySites), $this->arraySites, $this->text);
    }

    /**
     * Проверяем на наличие запрещённых сайтов в тексте
     * @return boolean
     */
    public function has(){
        return $this->text != $this->replace();
    }

    /**
     * Возвращаем массив возможных вариантов замены для каждого сайта
     * @return array
     */
    private function arraySites(){
        $sites = [];

        foreach ($this->sites as $site){
            foreach ($this->mask as $mask){
                $str = strtr($mask, [
                    '{host}' => $site['host'],
                    '{domain}' => $site['domain']
                ]);
                $sites[$str] = $this->replace;
            }
        }

        return $sites;
    }
}

.
The Fast, Secure and Professional - Yii2

Вот только, что придумал ещё добавить параметр query для $obj->sites.
Это позволит скрыть определённые урлы, типа site.ru/blog/3, если не нужно скрывать site.ru полностью, и позволит скрыть весь Query String если того требуется

.
Ей 25

Код использования класса конечно бомбезный... Сделай как то не знаю... Функцию какую то к классу или что. Может сам класс подшаманить. Что бы меньше кода было.
Так удобней будет. Там уже кому что надо изменить - изменит функцию или что. А то так как сейчас, половина(а может и больше) будет тыкать кругом вот тот большой код из ПП.

.
(\/)____o_O____(\/)

за комп сяду напишу что не так

.
The Fast, Secure and Professional - Yii2
# ValekS (13.02.2015 / 17:34)
Код использования класса конечно бомбезный... Сделай как то не знаю... Функцию какую то к классу или что. Может сам класс подшаманить. Что бы меньше кода было.
Так удобней будет. Там уже кому что над
Ну бомбезный потому, что много масок указываем. Для использования на сайте однозначно нужно запилить это всё в функцию и где нужно просто вызывать её blackSites($text)
Всего: 90