@ventacom

Как найти и заменить циклические ссылки на странице?

Добрый день!
Требуется найти и заменить циклические ссылки (которые ведут сами на себя) на странице.
Т.е. если пользователь находится на странице /shop/, то ссылку вида
<a href="/shop/" class="someclass">Магазин</a>
заменить на
<span>Магазин</span>
При этом в теге "a" могут присутствовать (или нет) различные атрибуты: class, target, title, и это не должно препятсвовать ее поиску и замене, т.е. важно, чтобы значение в href совпадало с $_SERVER['REQUEST_URI']
  • Вопрос задан
  • 336 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Kirill-Gorelov
С ума с IT
Я вижу тут два решения, но который предложу он более оптимальный.
На лету(при загрузки страницы) на стороне клиента с помощью js или php искать такие ссылки и заменять их регулярными выражениями.
https://regex101.com/ тут можно тестировать регулярные выражения.
Ответ написан
@woked
Пользуюсь таким кодом
index.php
function render(&$data) {
  $data = preg_replace_callback('/(\<a.*?href.*?=.*?("|\'))(.*?)(\2.*?>)/s', 'checkUrl', $data);
  return $data;
}

function checkUrl($match) { 
  
  if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
      $protocol = 'https://';
  } else {
      $protocol = 'http://';
  }

  $full_url = $protocol.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];

  if ($full_url{strlen($full_url)-1}=='/') {
    $full_url = substr($full_url, 0,strlen($full_url)-1);
  }

  $url = $_SERVER['REQUEST_URI'];

  if ($url{strlen($url)-1}=='/') {
    $url = substr($url, 0,strlen($url)-1);
  }

  if (preg_match('/^'.preg_quote($full_url,'/').'\/?$/', $match[3])||preg_match('/^'.preg_quote($url,'/').'\/?$/', $match[3])) {
      return $match[1].'#'.$match[2].' onclick='.$match[2].'return false;'.$match[4];
  } else {
      return $match[0];
  }
}

ob_start('render');

// other code

ob_end_flush();
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы