Просмотр поста

.
Rakovskiy
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;
    }
}