Добавить GET параметр ко всем ссылкам на странице

Доброго времени суток.
Начинаю изучать регулярные выражения, но до их освоения видимо еще далеко. Такая задача, нужно любым гипер ссылкам на странице добавить GET параметр, в том числе и тем у которых уже есть GET параметры.
Страница формируется на php.
Думаю уже в сторону каких-нибудь библиотек, которые позволят работать с DOM документа.
Найти гипеерсылки не составляет труда, видоизменить их тоже, но вот как начать замену в тексте?
Пытался через str_replace составить 2 массива - первый для найденых ссылок, второй для заменяемых, но несмотря на то, что оба массивы правильные, замена идет с ошибками, так как всякий раз поиск и замена осуществляется с начала текста.

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

  $regForUrl = '/"http://[+-_.0-9a-zA-Z/=&?]*"/';
  preg_match_all($regForUrl, $text, $result, PREG_PATTERN_ORDER);
  $result = array_shift($result);
  $find = array();
  $replace = array();

  foreach ($result as $url)
  {
    $url = str_replace('"', '', $url);
    $find[] = $url;
    $newUrl = $url;
    $urlPart = explode('?', $newUrl);
    $getString = isset($urlPart[1]) ? $urlPart[1] : null;
    if ( $getString )
    {
      $newUrl .= '&subscriber';
    }
    else
    {
      $newUrl .= "?subscriber";
    }
      $replace[] = $newUrl;
  }

  var_dump($find);
  var_dump($replace);
  return str_replace($find, $replace, $text);
 

1 ответов


Я не очень силен в регулярках, но может как-то так:


$str = '<p>some text <a href="/some/path/index.php">/some/path/index.php</a></p>
<p>some text <a href=\'
/some/path/index2.php\'>link2</a></p>
<p>some text <a href=/some/path/index3.php?foo=bar>link3</a></p>
<p>some text <a href=/some/path/index3.php?foo=bar>link4</a></p>'
;
$get_to_add = 'foo1=bar1&foo2=bar2';

$m = array();
if (preg_match_all('#(href=[\"\']*[^\s\"\'>]*)#si',$str,$m)) {
  $m[1] = array_unique($m[1]);
  foreach($m[1] as $link) {
    $d = strpos($link,'?') === false ? '?':'&';
    $str = str_replace($link,$link.$d.$get_to_add,$str);
  }
}

echo $str;

Вот выложил свою версию, ищет урл в кавычках (такие как в тэгах) и заменяет их на аналогичные, только добавляя GET параметр


$regForUrl = '/"http:\/\/[w]{0,3}.sima-land.ru\/[+-_.0-9a-zlA-Z\/=&\?]*"/';

function callback($match) {

  $goalName = 'GnM4Lhuxmy';

  $url = $match[0];
  $url = str_replace('"', '', $url); // удаляем кавычки

  // смотрим, есть ли в url get параметры
  $urlParts = explode('?', $url);
  if (isset($urlParts[1]))
  {
    $url .= '&' . $goalName;
  }
  else
  {
    $url .= '?' . $goalName;
  }

  $url = '"' . $url . '"'; // возвращаем кавычки

  return $url;

}

return preg_replace_callback($regForUrl, 'callback', $text);