распутывает безумие разделителя каталогов с помощью строковых манипуляций? - PullRequest
1 голос
/ 16 сентября 2011

Я работаю над преобразованием веб-сайта. Это включало стандартизацию структуры каталогов изображений и медиа-файлов. Я анализирую информацию о путях из различных тегов, стандартизирую их, проверяю, существует ли носитель в новом стандартизированном местоположении, и помещаю его туда, если его нет. Для этого я использую манипуляции со строками.

Это немного открытый, но есть ли класс, инструмент или концепция, которую я могу использовать, чтобы избавить себя от головной боли? Например, я сталкиваюсь с проблемами, когда, скажем, страница в подкаталоге (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 ]

1 голос
/ 16 сентября 2011

Если ваши проблемы коренятся в разрешении относительных ссылок из документа и разрешении в абсолютный (что составляет половину работы по отображению путей связанных изображений в файловую систему), я обычно использую Net_URL2 из груши .Это простой класс, который просто выполняет свою работу.

Чтобы установить в качестве пользователя root, просто позвоните

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

Даже если это бета-пакет, он действительно стабилен.

AНебольшой пример, скажем, есть массив со всеми рассматриваемыми srcs-изображениями и базовый 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 - это прежде всего адрес документа.Документ может переопределить его, указав другой с элементом base Документы .Таким образом, вы можете посмотреть это с помощью уже используемого вами анализатора HTML (а также значений src и href).

Net_URL2 отражает текущий RFC 3986 для разрешения URL.

Еще одна вещь, которая может пригодиться для обработки вашего URL - это функция getNormalizedURL.Он удаляет некоторые потенциальные случаи ошибок, такие как ненужные точечные сегменты и т. Д., Что полезно, если вам нужно сравнить один URL-адрес с другим и, естественно, для сопоставления URL-адреса с путем:

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

можно разрешить все 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.
}

Если у вас есть проблемы с объединением базового пути с путем изображения, путь к изображению всегда будет иметь косую черту в начале.

Надеюсь это поможет.

0 голосов
/ 16 сентября 2011

Truepath() на помощь! Нет, вы не должны использовать realpath() (, посмотрите, почему ).

...