Делаем все ссылки абсолютными

31
публикации
/**
 * Делает все ссылки абсолютными
 *
 * @param string $html
 * @return string
 */
public static function absolutize($html) {
    return preg_replace_callback('/<a[^>]+/', function($matches) {
        return preg_replace_callback(
            '/href=[\'"](?!\\/\\/|mailto:|[^\\/]*?:\\/\\/)\\/?(.*?)[\'"]/',
            function($m) {
                return 'href="//' . Sysinfo::host() .
                (strlen($m[1]) ? '/' : '') . $m[1] . '"';
            },
            $matches[0]
        );
    }, $html);
} 

Метод Sysinfo::host() возврашает имя хоста, например www.aplab.ru без слешей и без указания протокола.

Можно объединить оба регулярных выражения в одно, тем самым сократив количество кода.

Сначала находим все ссылки в документе. Заменяем значение атрибута href, которое не начинается с

  • mailto:
  • //
  • любые_символы_кроме_слеша://

дописывая в его начало //имя_хоста. Затем слеш и старое значение атрибута. Если старое значение было / или пустая строка, то ничего не дописываем.

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