/**
* Делает все ссылки абсолютными
*
* @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:
- //
- любые_символы_кроме_слеша://
дописывая в его начало //имя_хоста. Затем слеш и старое значение атрибута. Если старое значение было / или пустая строка, то ничего не дописываем.