1

私はウェブサイトの変換に取り組んでいます。これには、画像とメディア ファイルのディレクトリ構造の標準化が含まれていました。さまざまなタグからパス情報を解析して標準化し、新しい標準化された場所にメディアが存在するかどうかを確認し、存在しない場合はそこに置きます。そのために文字列操作を使用しています。

これは少し自由ですが、頭の痛い問題を解決するために使用できるクラス、ツール、または概念はありますか? たとえば、sudirectory ( website.com/subdir/dir/page.php) 内のページに相対イメージ パス ( ../images/image.png) がある、またはこのような他の種類の問題が発生しています。全体的な問題が 1 つあるというわけではありませんが、多くの小さな問題が積み重なっているだけです。

ほとんどのケースをカバーするスクリプトを作成したと思うと、Could not find file at export/standardized_folder/proper_image_folderimage.pngwhere it should beのようなエラーが発生しますexport/standardized_folder/proper_image_folder/image.png。文字列の解析と、ディレクトリの区切り記号が適切な場所にあることを確認するためのチェックを行って、私を怒らせるようなものです。

1 回限りのインポート スクリプトを非常に堅牢にするために、あまりにも多くの作業を行っているように感じます。おそらく、誰かがすでにこの混乱を再利用可能な方法で解きほぐしており、それを私が利用できるのでしょうか?

追記:より詳細なスクープを次に示します。ページの 1 つの「タイプ」を解析し、同じ種類のページからコンテンツを取得するスクリプトを作成します。次に、別の種類のページを解析するようにスクリプトを変更し、エラーのすべての種類を取得し、パスがどのように参照されるかについてのすべての仮定を窓の外に放り出す必要があることを学びます。洗って、すすいで、繰り返します。

そのため、スクリプトの主要なリファクタリングを行い、すべての仮定を捨て、パス情報をチェック、再チェック、およびダブルチェックすることを検討しています。私は本当に堅牢なパス構築スクリプトを構築しようとしているので、車輪の再発明を避けることができれば幸いです。そこに車輪はありますか?

4

2 に答える 2

1

問題の根源がドキュメントからの相対リンクの解決にあり、絶対リンクに解決される場合 (リンクされた画像のパスをファイル システムにマップする作業の半分になるはずです)、私は通常Net_URL2from pearを使用します。それはただ仕事をする単純なクラスです。

インストールするには、ルートとして呼び出すだけです

# 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 は、まずドキュメントのアドレスです。baseドキュメントは、要素Docsで別のドキュメントを指定することにより、それをオーバーライドできます。srcしたがって、既に使用している HTML パーサー (および とのhref値)を使用して調べることができます。

Net_URL2現在のRFC 3986を反映して URL 解決を行います。

URL の処理に便利なもう 1 つの機能は、getNormalizedURL関数です。不必要なドット セグメントなどのいくつかの潜在的なエラー ケースを削除します。これは、ある URL を別の URL と比較する必要がある場合や、当然ながら URL をパスにマッピングする必要がある場合に役立ちます。

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

Net_URL2したがって、すべての URL を絶対 URL に解決して正規化できるため、URL がまだインスタンスである限り、それらがサイトにとって問題であるかどうかを判断できます。多くの関数の 1 つを使用して実行できます。それ:

$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 に答える