使用字符串操作解开目录分隔符疯狂?

时间:2011-09-16 15:05:05

标签: php path relative-path string-parsing

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

这是一个有点开放的,但有没有一个类,工具或概念,我可以用它来节省一些麻烦?例如,我遇到了问题,例如,在一个目录(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。这让我很生气,进行字符串解析和检查以确保目录分隔符位于正确的位置。

我觉得我在制作一次性导入脚本非常强大方面做了太多工作。也许有人已经以一种可重复使用的方式解决了这个烂摊子,我可以利用它?

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

所以我正在考虑对我的脚本进行一些重要的重新分解,抛弃所有假设,检查,重新检查和仔细检查路径信息。因为我真的想要构建一个强大的路径构建脚本,希望我可以避免重新发明轮子。那边有轮子吗?

2 个答案:

答案 0 :(得分:1)

如果您的问题根源于解析文档中的相对链接并解析为绝对链接(应该是将链接图像路径映射到文件系统的工作量的一半),我通常会使用{{3} }。这是一个简单的课程,只做这项工作。

安装,以root身份调用

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

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

一个小例子,假设有一个数组,其中包含所有有问题的图像,并且文档有一个基本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是所有文档地址中的第一个。该文档可以通过使用Net_URL2 from pear指定另一个文档来覆盖它。因此,您可以使用您已经使用的HTML解析器(以及srchref值)来查看。

Net_URL2反映了当前base elementDocs进行网址解析。

您的URL处理可能更方便的另一件事是getNormalizedURL功能。它确实消除了一些潜在的错误情况,例如不必要的点段等。如果您需要将一个URL与另一个URL进行比较,并且自然地将URL映射到路径,那么它很有用:

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

因此,您可以将所有网址解析为绝对网址并将其标准化,您可以决定它们是否对您的网站有疑问,只要该网址仍然是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.
}

如果您在将基本路径与图像路径组合时遇到问题,则图像路径将始终以斜杠开头。

希望这会有所帮助。

答案 1 :(得分:0)

Truepath()救援! 不,您不应该使用realpath()see why)。