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

Shasoft

Новичок
Добавление префикса ко всем относительным URL-ам на странице

Стоит задача: ко всем относительным от корня сайта URL-ам на странице добавить свой префикc.
Т.е.
был адрес href="/forum/index.html" стал href="/l.ru/forum/index.html"
Т.е. был адрес href="forum/index.html" стал href="forum/index.html"
Префикс добавлять нужно НЕ ТОЛЬКО к ссылкам, но и к остальным URL-ам страницы. Картинки, обработчики форм и т.д.

Может есть в природе уже готовый скрипт для этого?
 

Фанат

oncle terrible
Команда форума
относительные от корня - это оксюморон.
или относительные, или от корня.
относительные делаются элементарно, через base href

а вообще, скорее всего, задача решается совсем другими средствами.
 

Nicholas

Новичок
можно тупо пройтись по тексту str_replace.
но ИМХО, это баг верстальщика, а не забота пхп программиста.
 

Shasoft

Новичок
относительные от корня - это оксюморон.
Правильно будет наверное так: во все локальные ссылки, которые адресуются от корня сайта нужно, нужно добавить префикс к адресу.

Собственно где отличие?
В данном случае отличий нет, так как ссылка НЕ от корня сайта.

можно тупо пройтись по тексту str_replace.
Ту пройтись не получится, так как непонятно, что именно надо заменять.

Это уже включено.


Смысл всех этих замен такой: делаю CMS. Адресная строка у неё имеет вид
<адрес сайта>/<название мода>/<строка адреса для мода>

CMS мультисайтовая, с поддержкой нескольких языков и нескольких дизайнов.
При смене пользователем дизайна или языка нужно как-то от страницы к странице передавать эти параметры.
Решил передавать через адреса с помощью так называемых модификаторов.
Т.е. новый вид адреса выглядит так:
<адрес сайта><модификаторы>/<название мода>/<строка адреса для мода>
пример модификатора: "l.ru" - модификатор, что сайт на русском языке
пример URL-а с модификатором: <адрес сайта>/l.ru/<название мода>/<строка адреса для мода>

При этом встает проблема, что при написании сайта нужно во всех URL-ах, которые идут от корня добавлять эти модификаторы при создании страницы (для относительных ссылок этого не нужно делать, так как и так вызовется с правильным адресом). Сейчас именно так и работает. Модификатор хранится в переменной и эту переменную нужно подставлять в нужные места. Однако, не очень красиво получается.

Как вариант решения - после формирования страницы добавлять эти префиксы к нужным адресам.
 

newARTix

Новичок
Ту пройтись не получится, так как непонятно, что именно надо заменять.
str_replace('href="/','href="/l.ru/',$html)

А вообще, очень похоже на то что это действительно должно решаться совсем другими средствами... у вас ссылка генерится и парсится с помощью пхп скрипта? Вот в его сторону и нужно смотреть, а не мучать бедный html...
 

Shasoft

Новичок
str_replace('href="/','href="/l.ru/',$html)
К этому надо ещё добавить:
+ str_replace('href=\'/','href=\'/l.ru/',$html)
+ str_replace('src="/','src="/l.ru/',$html)
+ str_replace('src=\'/','src=\'/l.ru/',$html)
+ str_replace('<домен>/','<домен>/l.ru/',$html)


Придется именно так и делать.
Я то надеялся, что кто-нибудь кажет на готовый скрипт и мне не придется самому его лепить. :)
А то меня беспокоит то, что я могу что забыть указать. К тому же ещё нужно учитывать
что тэги href и src могут иметь разный регистр. Надо придумать, как регэксп будет выглядеть для замены
в href/src

-~{}~ 30.10.08 11:10:

Вот ещё забыли что:
+ str_replace('ACTION="/','ACTION="/l.ru/',$html)
 

newARTix

Новичок
А то меня беспокоит то, что я могу что забыть указать.
Надо найти другой, адекватный проблеме, выход, и тогда этот костыль вас не будет беспокоить.
При смене пользователем дизайна или языка нужно как-то от страницы к странице передавать эти параметры.
Сессии.
Выход с модификаторами/префиксами будет актуален только когда юзер захочет передать ссылку другому юзеру (по аське), вот тут у нас будет успех (Хотя не стоит пренебрегать geoip). Во всех остальных случаях это абсолютно бессмысленно.
 

Shasoft

Новичок
Сессии - это первое, что мне в голову пришло.
Но я тут как раз капчу встраивал в CMS на ссесиях. Встроил, проверил - всё хорошо. Потом отключил куки - и перестало работать (что и не удивительно).

Поэтому теперь к сессии у меня отношение не очень хорошее. Если у пользователя куки отключены, то он может и обломаться (а может и не обломаться, если сервак будет сам добавлять PHPSESSID). Но в любом случае есть варианты, когда работать не будет, что не есть хорошо.

Поэтому вариант с добавлением прификса всё-таки предпочтительнее.
 

newARTix

Новичок
Shasoft
если юзер отключил куки, то он осознанно делает выбор в пользу анонимности, вопреки неудобству. Он еще и сам префикс подредактирует, чтобы никто не догадался о его родном языке. Зайдет через оффшорную прокси, чтобы никто не догадался о его стране пребывания. Запретит браузеру передавать refer и user_agent заголовки...
в любом случае есть варианты, когда работать не будет
 

Maxsystems

Новичок
Внедрять в сайт переменную содержащию адрес сайта:
$adres='saite.ru'; внедрять её во все шаблоны, что бы пути были не относительными.

В дальнейшем к этой переменной сможешь приделать все что у годно.

Если хочешь все побыстрому решение лежит через регулярные выражения, но они к сожаление муторны если ты сними никогда не работал.
 

Shasoft

Новичок
newARTix
Если пользователь отредактирует прификс, это его дело. Но нормлаьным пользователей, которые зашли, к примеру, на сайт на украинском языке я так и хочу в дальнейшем показывать сайт на украинском. А если пользователь сам руками убрал префикс, то пусть он смотрит сайт на том языке, что определен по умолчанию. В конце концов раз он может это читать, то ему и префиксы удалять не надо.

Maxsystems
Сейчас префик именно так и хранится, в переменной. Но не очень удобно получается его в ставка в html код.

Попробую с регулярными выражениями потренироваться. Вроде нашел свои старые примеры, оттуда попытаюсь сделать замену ссылок.

-~{}~ 30.10.08 14:52:

Поиск по инету дал исходный код для работы.
После некоторых доработок получил то, что мне надо было.
(Хотя ещё не плохобы было заменять ссылки в CSS, но это оставлю на будущее :) )
Может кому пригодится.
PHP:
<?php
 // Префикс
 $prefix = "/prefix";
 // Список тегов и аттрибутов, к котроым необходимо
 // добавить дополнительный параметр.
 // Формат строки:
 // <имя тега>[ <имя аттрибута>]+
 // Т.е. сначала идет имя тега, а затем, через пробел,
 // имена одного или нескольких аттрибутов.
 $tagsList = array(
     "a href",
     "link href",
     "area href",
     "frame src",
     "input src",
     "img src",
     "form action"
 );
 // Начинаем обработку всех тегов, указанных в массиве $tagsList
 foreach($tagsList as $tag)
 {
  // Разделяем список аттрибутов на составляющие
  $attrs = explode(' ',$tag);
  // Получаем имя тега (в массиве $attrs остается лишь список аттрибутов)
  $tag = array_shift($attrs);
  // Выполняем "патч" всех имеющихся в документе ссылок, содержащихся
  // в каждом из аттрибутов текущего тега
  foreach($attrs as $attr)
   $pageAll = preg_replace_callback("/(<".$tag.".+?".$attr."=[\'\"])(.+?)([\'\"])/si",
                                    "add_prefix",
                                    $pageAll);
 };
 // В эту функцию приходят все ссылки и тут мы их обрабатываем
 function add_prefix($matches)
 {
  $res = $matches[0];
  global $domen, $prefix;
  // Если это ссылка от корня сайта
  if( substr($matches[2],0,1)=="/" )
  {
   $res = $matches[1].$rootURL.$matches[2].$matches[3];
  }
  else // а может в ссылке присутствует адрес нашего домена
  {
   $matches[2] = preg_replace("/$domen\//si",
                              $domen.$prefix."/",
                              $matches[2]);
   $res = $matches[1].$matches[2].$matches[3];  
  }
  //
  return $res;
 }
?>
 

dimagolov

Новичок
Где вы такую траву берете? Вы в статическом html менять ссылки собрались? Для кого и когда? Не проще все ссылки генерить php функцией, которая бы вставляла нужные префиксы по вкусу?

А потом разбирать ваши префиксы и превращать их в параметры прекрасно сможет mod_rewrite
 

Shasoft

Новичок
Это НЕ статический html. Это текста страницы, сгенереный кодом PHP. И mod_rewrite уже настроен.
 

Ravanger

Новичок
Круто, PHP уже генерит динамический HTML ?? а яваскрипт он сам пишет? а можно он моей маме позвонит и скажет что у меня все хорошо?
 

Shasoft

Новичок
1. Траву не курю.
2. В моем понимании статический html - это просто страница статическая. Динамический HTML - эта страница, сгенереная PHP кодом. У меня страница генерится PHP кодом, поэтому в МОЕМ понимаи HTMLдинамический
2. Для кого и когда? - я это уже описал несколькими постами сверху
3. Не проще все ссылки генерить php функцией, которая бы вставляла нужные префиксы по вкусу? - Нет. Так как тогда надо контролировать, чтобы этот префикс прописывался в каждом адресе, что не есть хорошо, так как я всё таки делаю CMS (ну или её подобие) а не просто один сайт.
Вы всё-таки почитайте сначало посты, написанные выще.

4. Круто, PHP уже генерит динамический HTML ?? а яваскрипт он сам пишет? - Вы не поверите, но PHP УМЕЕТ писать в HTML. :)

5. а можно он моей маме позвонит и скажет что у меня все хорошо? - конечно. пишите на форуме телефон мамы.
 

Shasoft

Новичок
Вы не поверите, но PHP УМЕЕТ писать в HTML.

Пспешил. Хотел написать

Вы не поверите, но PHP УМЕЕТ писать в HTML JavaScript.
Я думаю с этим вы спорить не будете.

P.S. ПРедлагаю закончить треп не по существу. Я задачу решил. Решение представил на суд общественности, вдруг кому понадобится.
Если у вас по скрипту есть замечания по улучшению, то пишите.

P.S.S. Замечание типа "делайте всё чере "mod_rewrite и забейте на RegExp" не относится к разряду улучшений.
 

dimagolov

Новичок
Shasoft, объясни, зачем ты в начале php cкриптом генеришь код html (включая ссылки), сохраняешь его в $pageAll, а потом по этому $pageAll делаешь preg_replace_callback чтобы поменять ссылки?

наверное для того, чтобы часть ссылок можно было нарисовать руками в типа "шаблоке" или просто "исходнике" страницы.

а ты не думал, что вот захочешь переименовать какой-нибуть "мод" и придется всю эту статику руками искать и переименовывать?
 
Сверху