我正在努力转换网站。它涉及标准化图像和媒体文件的目录结构。我正在从各种标签中解析路径信息,对它们进行标准化,检查媒体是否存在于新的标准化位置,如果不存在则将其放在那里。我正在使用字符串操作。
这是一个有点开放的,但有没有一个类,工具或概念,我可以用它来节省一些麻烦?例如,我遇到了问题,例如,在一个目录(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
。这让我很生气,进行字符串解析和检查以确保目录分隔符位于正确的位置。
我觉得我在制作一次性导入脚本非常强大方面做了太多工作。也许有人已经以一种可重复使用的方式解决了这个烂摊子,我可以利用它?
发布脚本:所以这里有一个更深入的独家新闻。我编写的脚本解析了一个“类型”的页面,并从同类中提取内容。然后我将我的脚本解析为另一种类型的页面,获得所有错误,并了解所有关于如何引用路径的假设必须抛出窗口。洗涤,冲洗,重复。
所以我正在考虑对我的脚本进行一些重要的重新分解,抛弃所有假设,检查,重新检查和仔细检查路径信息。因为我真的想要构建一个强大的路径构建脚本,希望我可以避免重新发明轮子。那边有轮子吗?
答案 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解析器(以及src
和href
值)来查看。
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)。