Как сделать внешние ссылки nofollow

43
публикации

Эта функция добавляет атрибуты rel="nofollow" и target="_blank" ко всем внешним ссылкам за исключением некоторых хостов.

public static function nofollow($html) {
    $host = Sysinfo::host();
    $exclude = self::$exclude;
    if (!in_array($host, $exclude)) array_push($exclude, $host);
    array_walk($exclude, function(& $v, $k) {
        $v = preg_quote('//' . $v, '/');
    });
    $exclude = join('|', $exclude);
    return preg_replace_callback('/<a[^>]+/', function($matches) use ($exclude) {
        $link = $matches[0];
        if (strpos($link, self::FOLLOW) !== false) {
            return str_replace(self::FOLLOW, '', $link);
        }
        if (preg_match('/(href=\\S(?!' . $exclude . '))/i', $link)) {
            $link = rtrim(preg_replace('/(target=[\'"].*?[\'"]|rel=[\'"].*?[\'"])/', '', $link))
            . ' rel="nofollow" target="_blank"';
        }
        return $link;
    }, $html);
}

Sysinfo::host() возвращает имя хоста, где установлена система.

self::exclude может содержать дополнительные имена хостов для добавления в исключения.

protected static $exclude = array(
    'c1.aplab.ru',
    'aplab.ru'
);

Если ссылка содержит значение self::FOLLOW, то такая ссылка исключается из проверки и остается как есть.

Сам флаг self::FOLLOW удаляется из тега ссылки и заменяется пустой строкой.

Tags
#archive 61 #capsulecms 30 #featurerequest 26 #linux 22 #php 13 #windows 12 #phpstorm 8 #eclipse 8 #nginx 5 #bug 5 #font 4 #oldsite 4 #SEO 3 #antipattern 2 #quotes 2 #mvc 2 #nano 2 #debian 1 #ideas 1 #strtok 1 #qt 1 #capsulecmsv1 1 #netbeans 1 #iosevka 1 #puntoswitcher 1 #movie 1 #mariadb 1 #foobar 1 #apache 1 #git 1 #pidgin 1 #curl 1 #datetimepicker 1 #rsync 1 #bootstrap 1 #cmd 1 #iconv 1 #cms 1 #skype 1 #pdf 1 #algorithm 1 #composer 1 #copypaste 1 #sourcetree 1 #singleton 1 #mysql 1 #meld 1 #pattern 1 #postgresql 1