【问题标题】:How to make all src strings global in PHP?如何在 PHP 中使所有 src 字符串全局化?
【发布时间】:2011-11-29 07:06:08
【问题描述】:

我正在用 PHP 编写一个 Web 浏览器,用于不支持多标签浏览的设备(例如 Kindle)。目前我正在使用 file_get_contents() 读取页面源,然后将其回显到页面中。我的问题是很多页面使用了本地引用(比如'),所以它们都指向了不存在的页面。我想要做的是找到所有 src 和 href 标记,并将完整的网址添加到任何不以“http://”或“https://”开头的地址。我该怎么做?

【问题讨论】:

  • 我相信您在此处寻找的术语(并且很可能会为您提供更正确的答案)是非相对的。 (如何在 PHP 中使所有 src 字符串不相关? 或类似的东西)
  • 如何正确引用远程 css 文件中图像的 url?

标签: php regex browser local file-get-contents


【解决方案1】:

elibyy suggested 一样,我也建议使用base 标签。这是一种使用 PHP 原生的DOMDocument 的方法:

// example url
$url = 'http://example.com';
$doc = new DOMDocument();
$doc->loadHTMLFile( $url );

// first let's find out if there a base tag already
$baseElements = $doc->getElementsByTagName( 'base' );

// if so, skip this block
if( $baseElements->length < 1 )
{
    // no base tag found? let's create one
    $baseElement = $doc->createElement( 'base' );
    $baseElement->setAttribute( 'href', $url );
    $headElement = $doc->getElementsByTagName( 'head' )->item( 0 );
    $headElement->appendChild( $baseElement );
}

echo $doc->saveHTML();

话虽如此;你确定你知道你的目标有多么雄心勃勃吗?

例如,我认为这根本不是您真正需要的,因为您的应用程序基本上充当代理。因此,您可能至少希望通过您的应用程序路由所有用户可点击的链接,而不是将它们直接路由到原始链接,因为我认为您希望将用户保留在您的选项卡式应用程序中,而不是中断。

类似:

http://yourapplication.com/resource.php?resource=http://example.com/some/path/

现在,这当然可以通过基本上按照您的要求来实现,而不是在前面加上 http://https:// 前面的东西,这样它就会导致上面的示例 url。

但是,您将如何辨别哪些资源可以用于此操作,哪些资源不能?如果您对页面中的所有资源采用这种方法,您的应用程序将很快成为一个完整的代理,从而变得非常资源密集。

希望我已经为您提供了一个简短的开始,以便您考虑一些事情。

【讨论】:

  • 是的。我没有想到这一点。我现在有:` ` ,但如果文件不是 html,我不知道如何实际代理文件 - 我该如何处理图像?
【解决方案2】:

添加&lt;base href="http://example.com/" /&gt;

在页面顶部

this 将帮助您将其插入到&lt;head&gt;&lt;/head&gt; 部分

【讨论】:

  • 谢谢。我不能使用内部文本,因为它不是作为 html 元素而是作为字符串返回的;这就是我所拥有的:&lt;?php $url = "http://www.example.com"; $str = file_get_contents($url); $matche = array(); $pos = str_replace("&lt;head&gt;", '&lt;head&gt;\n&lt;base href="http://www.example.com" /&gt;', $str); echo $pos; ?&gt;
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多