PHP:将相对 img src url 转换为绝对 URL

发布于 2024-10-31 18:58:31 字数 434 浏览 5 评论 0原文

我已经使用 cURL 将 HTML 页面提取到字符串中,并将其加载到 DOMDocument 中。在那里我可以获得所有的 img 标签及其源属性。我现在的问题是...我怎样才能使这些 URL 绝对化?

URL 列表可以包含各种变体,例如:

  • foobar.jpg
  • http://example.com/foobar.jpg
  • /foobar.jpg< /code>
  • ../foobar.jpg
  • folder/foobar.jpg

如果从任意 URL 获取 HTML,将这些图像 URL 转换为绝对 URL 的安全方法是什么那些?有没有办法也可以考虑基本标签?

I have fetched an HTML page using cURL into a string and loaded it up in a DOMDocument. There I can get all the img tags and their source attributes. My problem now is... how can I make these URLs absolute?

The list of URLs can contain all kinds of variants, for example:

  • foobar.jpg
  • http://example.com/foobar.jpg
  • /foobar.jpg
  • ../foobar.jpg
  • folder/foobar.jpg

If the HTML is fetched from an arbitrary URL, what is a safe way of converting these image URLs into absolute ones? Is there a way you can take the base tag into consideration too?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

国粹 2024-11-07 18:58:31

这是一个很棒的 PHP 示例,说明如何执行此操作。

function rel2abs($rel, $base) { 
// something
}

更多好的示例:

Here is great PHP example how to do this.

function rel2abs($rel, $base) { 
// something
}

More good examples:

冷弦 2024-11-07 18:58:31

在这里,您可以在此页面上找到一个方便的函数:

function absUrl($rel, $base) {
    if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
    if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
    extract(parse_url($base));
    $path = preg_replace('#/[^/]*$#', '', $path);
    if ($rel[0] == '/') $path = '';
    $abs = "$host$path/$rel"; 
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
    for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}   
    return $scheme.'://'.$abs;
}

$rel是您的相对路径, $base 是您的基本 URL。

Here you are a handy function found on this page :

function absUrl($rel, $base) {
    if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
    if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
    extract(parse_url($base));
    $path = preg_replace('#/[^/]*$#', '', $path);
    if ($rel[0] == '/') $path = '';
    $abs = "$host$path/$rel"; 
    $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
    for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}   
    return $scheme.'://'.$abs;
}

$rel is your relative path and $base is your base URL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文