1

我正在转换一个网站。它涉及标准化图像和媒体文件的目录结构。我正在解析来自各种标签的路径信息,对其进行标准化,检查媒体是否存在于新的标准化位置,如果不存在则将其放在那里。我正在使用字符串操作来做到这一点。

这有点开放式,但是有没有我可以使用的类、工具或概念来为自己省去一些头痛?例如,我遇到了问题,例如,子目录 ( website.com/subdir/dir/page.php) 中的页面具有相对图像路径 ( ../images/image.png),或其他类似的东西。这不是一个总体问题,而是很多小事情加起来。

当我认为我的脚本涵盖了大多数情况时,我会收到错误,比如Could not find file at export/standardized_folder/proper_image_folderimage.png应该在哪里export/standardized_folder/proper_image_folder/image.png。这有点让我发疯,进行字符串解析和检查以确保目录分隔符位于正确的位置。

我觉得我在使一次性导入脚本非常健壮方面投入了太多精力。也许有人已经以一种可重复使用的方式解开了这个混乱,我可以利用这种方式?

后记:所以这里有一个更深入的独家新闻。我编写了解析一种“类型”页面并从同类页面中提取内容的脚本。然后我将我的脚本转为解析另一种类型的页面,获取所有错误,并了解到我关于如何引用路径的所有假设都必须抛诸脑后。洗涤,冲洗,重复。

所以我正在考虑对我的脚本进行一些重大的重构,抛弃所有假设,并检查、重新检查和仔细检查路径信息。由于我真的在尝试构建一个强大的路径构建脚本,希望我可以避免重新发明轮子。外面有轮子吗?

4

2 回答 2

1

如果您的问题源于解决文档中的相对链接并解析为绝对链接(这应该是将链接图像路径映射到文件系统的一半工作),我通常使用Net_URL2from pear。这是一个简单的类,只是完成这项工作。

要安装,作为 root 只需调用

# pear install channel://pear.php.net/Net_URL2-0.3.1

即使它是一个测试包,它也非常稳定。

举个小例子,假设有一个包含所有相关图像 src 的数组,并且有一个文档的基本 URL:

require_once('Net/URL2.php');

$baseUrl = 'http://www.example.com/test/images.html';

$docSrcs = array(...);

$baseUrl = new Net_URL2($baseUrl);

foreach($docSrcs as $href)
{
    $url = $baseUrl->resolve($href);
    echo ' * ', $href, ' -> ', $url->getURL(), "\n";
    // or
    echo " $href -> $url\n"; # Net_URL2 supports string context
}

这将根据您的基本 URL 将任何相对链接转换为绝对链接。基本 URL 首先是文档地址。该文档可以通过使用Docsbase元素指定另一个文档来覆盖它。因此,您可以使用您已经在使用的 HTML 解析器(以及srcandhref值)进行查找。

Net_URL2反映了当前RFC 3986进行 URL 解析。

另一个可能对您的 URL 处理很方便的是getNormalizedURL函数。它确实消除了一些潜在的错误情况,如不必要的点段等

foreach($docSrcs as $href)
{
    $url = $baseUrl->resolve($href);
    $url = $url->getNormalizedURL();
    echo " $href -> $url\n";
}

因此,当您可以将所有 URL 解析为绝对 URL 并将它们标准化时,您可以决定它们是否对您的站点有问题,只要 url 仍然是一个Net_URL2实例,您就可以使用众多功能之一来做那:

$host = strtolower($url->getHost());
if (in_array($host, array('example.com', 'www.example.com'))
{
    # URL is on my server, process it further
}

左边是 URL 中文件的具体路径:

$path = $url->getPath();

考虑到您要与 UNIX 文件系统进行比较,该路径应该很容易以具体的基本目录作为前缀:

$filesystemImagePath = '/var/www/site-new/images';
$newPath = $filesystemImagePath . $path;
if (is_file($newPath))
{
    # new image already exists.
}

如果您在将基本路径与图像路径组合时遇到问题,则图像路径的开头总是会有一个斜线。

希望这可以帮助。

于 2011-09-16T16:35:28.010 回答
0

Truepath()救援!不,你不应该使用realpath()看看为什么)。

于 2011-09-16T15:09:21.683 回答