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);

?>

我正在尝试用 new.martianguy.com (所有 href 和 scr 属性)替换域 martianguy.com 的所有链接。在 file_get_html 函数中使用当前页面 url 可以吗?当我在本地主机上测试它时,它什么也没做,30 秒后超时。

4

3 回答 3

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 和链接。

于 2013-07-02T12:56:40.273 回答
1

在我看来,这个脚本将是递归的。如果 curPageUrl() 返回当前页面/脚本的 URL,并且调用 curPageUrl() 的脚本在同一页面上,那么该脚本不会通过 http 调用自身吗?如果是这种情况,它将在 30 秒后解释超时。该脚本通过 http 递归调用自身,直到您第一次调用 php max_execution_time,默认为 30 秒。

一些建议:

  1. 如果脚本必须在此页面上,请在 curPageUrl() 中将 get 变量添加到 URL,然后仅在未设置变量时运行替换代码:

    if($_REQUEST['loaded'] != 1) {
        $html = file_get_contents(curPageURL()."?loaded=1");
        echo str_ireplace("oldURL","newURL", $html);
    }
    
  2. 使用 javascript,它在加载 html 后在页面上运行,并在客户端进行替换。

  3. 这假设您尝试替换的内容是动态的。如果它是静态的,我会将其保存到文件中,然后使用另一个脚本进行替换。

希望有帮助!

于 2013-07-02T13:20:28.487 回答
0

str_ireplace 函数不会就地更改字符串。您需要将该函数的输出分配给一个变量。

于 2013-07-02T12:55:24.910 回答