Замена всех ссылок на странице

Celestial

Новичок
Доброго времени суток.
Пишу прокси на php, чтобы можно было внешние сайты открывать через мой скрипт.
Видел много примеров таких скриптов, но они слишком уж наворочены, хочется в целях обучения написать что-то свое.
Пока есть вот это:
Код:
<html>
   <head>
       <title>PHP Proxy</title>
   </head>
   <body>
       <div align = "center">
       <form id = "form" name = "form" method = "get" action = "/index.php">
           <input name = "q" value = "http://yandex.ru" type = "text" size = "100"/>
           <input type = "submit" value = "[Open]"/>
       </form>
       </div>
       <hr>
       
   </body>   
</html>

<?php
   $url = $_GET['q'];
   
   if(isset($url))
   {
       $text = file_get_contents(trim($url));

       preg_match_all('/href="([^"]+)"/', $text, $links);
       
       foreach($links[1] as $key => $link)
       {
           echo $link."<br/>";   
       }

       echo "<hr>";

       echo $text;   
   }
?>
Тут я открываю сайт яндекса и нахожу через preg_match_all все ссылки на нем.
Вопрос такой, как заменить все найденные ссылки на что-то вроде:
http://myhost.com/index.php?q=найденная ссылка.
Скорее всего это можно сделать через preg replace, но не знаю каким должен быть второй параметр.
Помогите пожалуйста решить эту проблему.
 

Celestial

Новичок
Есть шаблон, который корректно находит все ссылки которые есть на странице, а именно '/href="([^"]+)"/', не понятно каким должен быть второй параметр в preg_replace, чтобы все ссылки на странице стали вида: http://myhost.com/index.php?q=найденнаяя_ссылка

К примеру, если применить такую регулярку, то некоторые ссылки заменяются, но некоторые она пропускает и они остаются такими же какими были:

Код:
       $text = file_get_contents(trim($url));
       
       $regV = '#(<a[a-z\-_\s\"\#\=]*)(href=")((https?|ftp)://)#i';
       $replace = '$1$2index.php?q=$3';
       
       echo preg_replace($regV, $replace, $text);
Как сделать так, чтобы заменились все ссылки?
 

Celestial

Новичок
На странице есть ссылки вида: yandex.ru/video, их регулярка пропускает.
 

fixxxer

К.О.
Партнер клуба
Это у тебя проблема не со вторым аргументом, а с первым. Правь регулярку, чтобы матчилось все, что нужно.
 

Celestial

Новичок
Не знаю, правильно ли понял. Попробовал так:
Код:
<html>
   <head>
       <title>PHP Proxy</title>
   </head>
   <body>
       <div align = "center">
       <form id = "form" name = "form" method = "get" action = "/index.php">
           <input name = "q" value = "http://yandex.ru" type = "text" size = "100"/>
           <input type = "submit" value = "[Open]"/>
       </form>
       </div>
       <hr>
       
   </body>   
</html>

<?php
   $url = $_GET['q'];
   
   if(isset($url))
   {
       $text = file_get_contents(trim($url));

       preg_replace('/href="([^"]+)"/', '/index.php?q=$10', $text);

       echo $text;   
   }
?>
Вообще ссылки не заменяет, помогите пожалуйста
 

antson

Новичок
Партнер клуба
@Celestial,
а еще там бывает ..
1) ajax
2) сайты написанные на JSP (активно используются куки и контент страницы зависит от предыдущих запросов)
3) специальные заголовки типа X-Frame-Options и т.д.
4) 206 тип ответа для доставки информации (видео ютуба)
и не забываем про https ;)
 

antson

Новичок
Партнер клуба
@WMix, на пхп так не извращаются .
обычный сценарий jsp
get
в ответ установлен кука и в тексте страницы еще переменная (асп правда тоже сует кучу служебных полей )
потом на пункт меню жмем.
К серверу пошел пост.
в ответ редирект
гетом следующую страницу.
потом еще 3-4 аjax запроса , которые вернут json
страница js заполняется .
И вот тебе нужно клик на ссылку во выведенной табличке
а ссылка тоже постом на сервак . И отослать нужно данные размазанные по запросам с первого шага (по кукам, js переменным и вообще черте где )
 

WMix

герр M:)ller
Партнер клуба
@antson, jsp это простой шаблонизатор, некий набор тегов и привязка к java-framework. замени на twig. хотя конечно ты прав, возможностей там очень много.
 

AnrDaemon

Продвинутый новичок
По существу тебе уже ответили выше. Задача не решается без написания целой системы подделки трафика.
 

antson

Новичок
Партнер клуба
ну если к вопросу чисто по ссылкам. то случаев там больше чем на одну маску и простейшую логику.
1) случай http://site.ru/чегото
2) https://site.ru/чегото
3) //site.ru/чегото
4) /чегото
5) чегото - тут относительно текущей страницы
6) случаи 4 и 5 вместе директивой корневой страницы

в 3 случае нужно помнить https или нет исходно запросил
 
Сверху