@strelov1

Как закрыть все ссылки на сайте за исключением узказнных?

Необходимо сделать все ссылки внутренними через скрипт например
<a href="http://google.com">Ссылка должна быть закрыта</a>

должна превратиться в
<a href="http://site.ru/go.php?url=http://google.com">Ссылка должна быть закрыта</a>


Но это не должно коснуться ссылок этого же домена записанных в абсолютном виде
<a href="http://site.ru/">Ссылка не должна быть закрыта</a>

И внутренних ссылок типа:
<a href="/contact">Ссылка не должна  быть закрыта</a>

А также ссылок с определенным классом
echo '<a href="http://google.ru" class="link">Ссылка не должна быть закрыта</a>';

Вот что получилось сделать:
ob_start(f_callback);

echo '<a href="http://google.com">Ссылка должна  быть закрыта</a>';
echo '<br>';
echo '<a href="http://site.ru/">Ссылка не должна  быть закрыта</a>';
echo '<br>';
echo '<a href="/contact">Ссылка не должна  быть закрыта</a>';
echo '<br>';
echo '<a href="http://google.ru" class="link">Ссылка не должна быть закрыта</a>';

function f_callback($buffer){
	$pattern = '~(<a[a-z\-_\s\"\#\=]*)(href=")((https?|ftp)://)~i'; 
	$replace = '$1$2http://site.ru/go.php?url=$3';
	$buffer = preg_replace($pattern, $replace, $buffer);
	return $buffer;
}

Данный код закрывает все ссылки за исключением внутренних. Как написать условие в регулярном выражении исключающее ссылок начинающихся с текущего домена, и имеющих определенный класс
  • Вопрос задан
  • 373 просмотра
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Можно использовать PCRE утверждения:
function f_callback($buffer)
{
    $pattern = '~(<a[a-z\-_\s\"\#\=]*)(href=")((https?|ftp)://(?!site.ru|[^"]*"\s+class="link"))~i'; 
    $replace = '$1$2http://site.ru/go.php?url=$3';
    $buffer = preg_replace($pattern, $replace, $buffer);
    return $buffer;
}

ob_start('f_callback');

echo '<a href="http://google.com">Ссылка должна  быть закрыта</a>';
echo '<br>';
echo '<a href="http://site.ru/">Ссылка не должна  быть закрыта</a>';
echo '<br>';
echo '<a href="/contact">Ссылка не должна  быть закрыта</a>';
echo '<br>';
echo '<a href="http://google.ru" class="link">Ссылка не должна быть закрыта</a>';

Делать подобное в один вызов preg_replace() это конечно здорово, но если добавить ещё несколько подобных требований, то регулярное выражение будет очень сложно понять. Поэтому лучше для подобных задач использовать preg_replace_callback. Внутри callback-функции уже осуществлять все необходимые проверки, например, с помощью preg_match.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Vladzimir
Рекомендую использовать phpQuery.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы