@Preci

Как составить регулярное выражение?

Здравствуйте!

Никак не могу составить рабочее регулярное выражение.

Мне необходимо заменить все href у внешних ссылок на site.ru/out.php?url=&id=

Пока мой мозг дошел только до этого:

preg_match_all('~<a.*?href="([^"]+)".*?>(.*?)</a>~s', $content, $links);
		foreach ($links[1] as $l) {
		$content = str_replace($l,  '/out.php?url='. base64_encode($l) .'&id='. $post->ID, $content); 
		}
		return $content;


Но он не подходит под все мои условия.

Что нужно:

если ссылка НЕ на мой домен (site.ru, img.site.ru, forum.site.ru)

     добавить rel="nofollow"

если в домене ссылки есть домен из массива $badlinks

          *Проверяем есть ли в ссылке #! (это ссылки на mega.nz и mega.co.nz)
           
                   Если есть, то закодировать href в base64 и заменить на site.ru/out.php?url=<ссылка>&fuckMega=1&id=<ID поста>
          
                   Если нет, то заменить href ссылок на site.ru/out.php?url=<ссылка>&id=<ID поста>


Зачем мне это?

1. nofollow для внешних ссылок
2. В out.php идет редирект на url, но перед этим в базу заносится клик для поста

* С ссылками на mega есть проблемы - у них в url есть #! - в результате в out.php параметр url передается не полный, а обрезается все что начинается с #!.... т.е. доходит только домен mega.co/ вместо mega.co/#!asdad232141f а т.к. на странице out.php идет редирект на url - единственный выход, который я нашел, это закодировать ссылку на mega и добавить параметр fuckMega = 1 что бы в out.php ее раскодировать
  • Вопрос задан
  • 622 просмотра
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Кодируйте данные в QUERY STRING корректно и не придётся делать странные костыли, прыгая по тем же самым граблям повторно.
urlencode, rawurlencode и вообще http_build_query

Ещё осталось заменить match на куда более уместный preg_replace_callback и код будет выглядеть хотя бы вменяемо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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