Разбор Robots.txt

Этот пример класса, получающего и разбирающего файл robots.txt.

class robots
{
    var $content = ''; # текст файла robots.txt
    var $branches = []; # здесь храним ветки для разных User-Agent

    # конструктор
    # @url: адрес сайта или хост в произвольном формате
    function robots($url)
    {
        # получаем файл robots.txt
        $url = preg_replace('#^http://#is', '', trim($url));
        $url = current(explode('/', $url));
        $this->content = trim(file_get_contents('http://' . $url . '/robots.txt'));

        # парсим полученные данные
        $s = preg_split('#[\n]+#is', $this->content);
        $current_user_agent = '';
        foreach($s as $line)
        {
            $line = trim(current(explode('#', trim($line), 2)));
            if (substr_count($line, ':')<1) continue;
            $line = explode(':', $line, 2);
            $current_directive = strtolower(trim($line[0]));
            $current_value = trim($line[1]);
            if ($current_directive == 'user-agent')
            {
                $current_user_agent = $current_value;
            }
            elseif($current_user_agent!='')
            {
                $this->branches[$current_user_agent][$current_directive][] = $current_value;
            }
        }
    }

    # получить значение заданной директивы для заданного агента
    # @user_agent: агент
    # @directive: имя директивы
    # возвратит FALSE если директива не указана
    function get_directive($user_agent, $directive)
    {
        $user_agent = strtolower($user_agent);
        $directive = strtolower($directive);
        $ret = [];
        foreach($this->branches as $ua_mask=>$data)
        {
            if (($ua_mask=='*' || $user_agent=='*' || @preg_match('#'.preg_quote($ua_mask,'#').'#is', $user_agent)) && isset($data[$directive]))
            {
                $ret = array_merge($ret, $data[$directive]);
            }
        }
        if (count($ret)>0) return array_unique($ret); else return FALSE;
    }

    # проверить, запрещен ли url к индексации
    # @user_agent: агент
    # @url: полный url для проверки
    # возвратит TRUE если url запрещен
    function check_disallow($user_agent, $url)
    {
        $url = preg_replace('#^http://#is', '', trim($url));
        $url = explode('/', $url, 2);
        $url = (count($url)>1) ? '/' . $url[1] : '/' . $url[0];
        $url = trim($url);
        $info = $this->get_directive($user_agent, 'Disallow');
        foreach($info as $url_mask)
        {
            if (preg_match('#^'.preg_quote($url_mask, '#').'#', $url))
            {
                return true;
            }
        }
        return false;
    }
}

Смотрите также пример разбора файла robots.txt и проверки на соотвествие шаблону Disallow


.