2013-07-02 3 views
0
<?php 

include('simple_html_dom.php'); 
function curPageURL() { 
    $pageURL = 'http'; 
    $pageURL .= "://"; 
    if ($_SERVER["SERVER_PORT"] != "80") { 
     $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
    }else { 
     $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; 
    } 
    return $pageURL; 
} 

// Retrieve the DOM from a given URL 
$html = file_get_html(curPageURL()); 
str_ireplace("http://martianguy.com","http://new.martianguy.com", $html); 

?> 

Я пытаюсь заменить все ссылки на домен martianguy.com на new.martianguy.com (все атрибуты href и scr). Можно ли использовать текущий URL-адрес страницы в функции file_get_html? Когда я тестирую это на своем локальном хосте, он ничего не делает и время истекает через 30 секунд.Пытается переписать URL. Правильно ли этот код?

+0

И какой результат вы ожидаете? – matino

+0

Я ожидаю, что все URL-адреса в src и href меняются. например, http://martianguy.com/abc/def следует изменить на http://new.martianguy.com/abc/def –

ответ

1

Кажется, что этот сценарий будет рекурсивным. Если curPageUrl() возвращает URL-адрес текущей страницы/скрипта, а скрипт, вызывающий curPageUrl(), находится на той же странице, не будет ли скрипт отвечать на HTTP? Если это так, это объясняет таймаут через 30 секунд. Скрипт вызывает себя по адресу http рекурсивно, пока вы не нажмете на php max_execution_time для первого вызова, который по умолчанию составляет 30 секунд.

Некоторые предложения:

  1. Если скрипт должен быть на этой странице, добавьте переменную GET в URL в curPageUrl(), а затем только запустить свой код замены, если переменная не установлена:

    if($_REQUEST['loaded'] != 1) { 
        $html = file_get_contents(curPageURL()."?loaded=1"); 
        echo str_ireplace("oldURL","newURL", $html); 
    } 
    
  2. Используйте javascript, который запускается на странице после загрузки html, и выполняет замену на стороне клиента.

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

Надеюсь, что это поможет!

+0

Это абсолютно верно, сценарий рекурсивный. – roptch

+0

это помогает, спасибо! Если я использую javascript, он все равно внесет изменения до того, как браузер начнет запрашивать ресурсы правильно? –

+0

Если это ссылки, они не запрашиваются, пока кто-то не нажимает на них. Это трюк для изображений и других ресурсов. Некоторое обсуждение здесь: http://stackoverflow.com/questions/14415027/change-src-of-image-before-request-has-been-sent (Gist: он может работать на старых браузерах, но не является надежным на более новых) – luke

0

Функция str_ireplace не изменяет последовательности на месте. Вы должны назначить вывод этой функции переменной.

2

file_get_html() возвращает объект DOM (http://simplehtmldom.sourceforge.net/manual_api.htm), в то время как str_ireplace ожидает строку (http://www.php.net/manual/en/function.str-ireplace.php).

Вам необходимо пройти через объект DOM и выполнить замену для каждого узла. Вы также можете просто использовать file_get_contents (http://php.net/manual/en/function.file-get-contents.php) и заменить каждое появление URL-адреса, но в этом случае это будут не только src и href.

+0

Infact, было бы лучше, если бы все случаи были заменены. Как мне пройти через DOM? (Я новичок в этом мире) :-) –

+0

Если вы действительно хотите ВСЕ вхождения url на всей странице html (а не только атрибуты src и href), то просто замените файл_get_html на file_get_contents. – roptch

Смежные вопросы