PDA

Просмотр полной версии : [Q] file_get_content и относительные пути (php)


draliokero
01.04.2009, 00:01
echo file_get_contents("http://www.google.ru");
Помогите нужно заменить все относительные пути в ссылках и в action’ах на прямые.

И еще вопрос: на странице, которую я получаю, через file_get_contents, есть каптча, если пути изменить на полные и отправить, пройдут ли обработку формы?

KaZ@NoVa
01.04.2009, 00:22
Заменить все относительные пути в ссылках и в action’ах на прямые можно с помощью регулярных выражений.

И еще вопрос: на странице, которую я получаю, через file_get_contents, есть каптча, если пути изменить на полные и отправить, пройдут ли обработку формы?
Если ссылки будут указывать именно на тот же скрипт-капчу, но просто с полным путём, то всё должно быть ок =)

draliokero
01.04.2009, 00:30
Допустим, получил страницу http://site.com/bla/bla/index.php
action у форм такой ../../file.php т.е. на два уровня выше,
сложно будет с регулярками сделать вида http://site.com/file.php :-(

Sharky
01.04.2009, 00:30
Если ссылки будут указывать именно на тот же скрипт-капчу, но просто с полным путём, то всё должно быть ок =)
а если проверка referer? тогда без подмены запроса не обойтись

draliokero
01.04.2009, 01:46
В общем, нашел функцию... помогите, пожалуйста, теперь с циклом, чтобы все ссылки привести в абсолютный вид и вывести страницу :-)
<?php
/**
* Приведение ссылки к абсолютному URI
*
* @param string $link ссылка (абсолютный URI, абсолютный путь на сайте, относительный путь)
* @param string $base базовый URI (можно без "http://")
* @return string абсолютный URI ссылки
*/
function uri2absolute($link, $base)
{
if (!preg_match('~^(http://[^/?#]+)?([^?#]*)?(\?[^#]*)?(#.*)?$~i', $link . '#', $matchesLink)) {
return false;
}
if (!empty($matchesLink[1])) {
return $link;
}
if (!preg_match('~^(http://)?([^/?#]+)(/[^?#]*)?(\?[^#]*)?(#.*)?$~i', $base . '#', $matchesBase)) {
return false;
}
if (empty($matchesLink[2])) {
if (empty($matchesLink[3])) {
return 'http://' . $matchesBase[2] . $matchesBase[3] . $matchesBase[4];;
}
return 'http://' . $matchesBase[2] . $matchesBase[3] . $matchesLink[3];
}
$pathLink = explode('/', $matchesLink[2]);
if ($pathLink[0] == '') {
return 'http://' . $matchesBase[2] . $matchesLink[2] . $matchesLink[3];
}
$pathBase = explode('/', preg_replace('~^/~', '', $matchesBase[3]));
if (sizeOf($pathBase) > 0) {
array_pop($pathBase);
}
foreach ($pathLink as $p) {
if ($p == '.') {
continue;
} elseif ($p == '..') {
if (sizeOf($pathBase) > 0) {
array_pop($pathBase);
}
} else {
array_push($pathBase, $p);
}
}
return 'http://' . $matchesBase[2] . '/' . implode('/', $pathBase) . $matchesLink[3];
}

$url = "http://www.google.ru/";
$content = file_get_contents($url);

preg_match_all("#src=['\"]([^'\"].*\.(gif|jpg|jpeg|png|js))#iU", $content, $images);
...........

draliokero
02.04.2009, 06:44
Может кто нибудь помочь? :-)

.:EnoT:.
02.04.2009, 08:20
в помойку выкинь эти функции)

Проще всего заставить браузер грузить картинки, css и т.д. с другого сайта путём html

Вставляешь вот этот код и любуешься (желательно после <head>, но можно и в самом начале).
<base href="http://vkontakte.ru/" />
Но ajax у тебя работать не будет, надеюсь сам знаешь почему :)

Ну или в крайнем случае реплейсом меняй ссылки. что-то типо того:


$str = file_get_contents('http://vkontakte.ru/');
$str = preg_replace('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="http://vkontakte.ru/\\2"', $str);
echo $str;

draliokero
02.04.2009, 15:44
.:EnoT:., спс, самое простое решение будет, тупо дописывать <base href="" />

REDz
03.04.2009, 05:12
Чет не допонял, автор те нужен тип граб? Так это он делается другим способом...