【问题标题】:Trying to rewrite url. Is this code correct?试图重写网址。这段代码正确吗?
【发布时间】:2013-07-02 21:42:53
【问题描述】:
<?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 替换域 martianguy.com 的所有链接(所有 href 和 scr 属性)。在 file_get_html 函数中使用当前页面 url 可以吗?当我在我的本地主机上测试它时,它什么也没做,并且在 30 秒后超时。

【问题讨论】:

标签: php url-rewriting


【解决方案1】:

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。

【讨论】:

  • 事实上,如果每次出现都被替换是最好的。如何循环遍历 DOM? (我是这个世界的新手):-)
  • 如果你真的想在整个 html 页面中出现所有的 url(不仅仅是 src 和 href 属性),那么只需将 file_get_html 替换为 file_get_contents。
【解决方案2】:

在我看来这个脚本是递归的。如果 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. 这假定您尝试替换的内容是动态的。如果它是静态的,我会将其保存到一个文件中,然后使用另一个脚本进行替换。

希望有帮助!

【讨论】:

  • 完全正确,脚本是递归的。
  • 这肯定有帮助,谢谢!如果我使用 javascript,它仍然会在浏览器开始请求资源之前进行更改,对吗?
  • 如果它们是链接,那么在有人点击它们之前不会请求它们。对于图像和其他资源来说,这很棘手。在这里进行一些讨论:stackoverflow.com/questions/14415027/…(要点:它可能适用于旧浏览器,但不适用于新浏览器)
  • @lukek 只有当我在客户端使用 javascript 时才这样吗?如果我使用服务器端脚本,则在浏览器获取 html 之前会进行更改。
  • @lukek Okey,我正在使用您的建议 1 并进行这些更改。但是 'echo str_ireplace("oldURL","newURL", $html);'附加到页面的现有源代码而不是替换它。你也可以帮我解决这个问题吗?感谢您迄今为止对我的帮助。球在滚动!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2015-09-21
    • 1970-01-01
    • 2019-10-30
    • 2011-06-26
    • 2013-03-06
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多