1

PHP でページを単純にキャッシュする基本的なクローラーを作成しています。

get_file_contentsWebページのコンテンツを取得するために使用し、正規表現を使用してすべてのリンクを取得するだけです<a href="URL">DESCRIPTION</a>-現時点では次のように返されます:

Array {
[url] => URL
[desc] => DESCRIPTION
}

私が抱えている問題は、ページ リンクがローカルかどうかを判断する背後にあるロジックを理解すること、または完全に異なるローカル ディレクトリにある可能性があるかどうかを判断することです。

組み合わせはいくつでも可能です:href="../folder/folder2/blah/page.html"またはhref="google.com"またはhref="page.html"- 可能性は無限大です。

これにアプローチする正しいアルゴリズムは何でしょうか? 重要なデータを失いたくありません。

4

3 に答える 3

3

まず、正規表現と HTML は混在しません。使用する:

foreach(DOMDocument::loadHTML($source)->getElementsByTagName('a') as $a)
{
  $a->getAttribute('href');
}

//あなたのサイトの外に出る可能性のあるリンクは、protocol またはで始まります。

http://example.com
//example.com/

href="google.com"ローカルファイルへのリンクです。

しかし、サイトの静的コピーを作成したい場合は、なぜ使用しないのwgetでしょうか?

于 2008-12-11T22:55:02.690 に答える
1

まず、ローカルリンクのプロパティについて考えてみましょう。

これらは次のいずれかになります。

  • スキームホストもない相対的な、または
  • 'http'または'https'のスキームと、スクリプトの実行元のマシンに一致するホストを使用する絶対

リンクがローカルであるかどうかを識別するために必要なロジックはこれだけです。

parse_url関数を使用して、URLのさまざまなコンポーネントを分離し、スキームホストを識別します。

于 2008-12-15T19:16:14.613 に答える
0

href で http:// を探す必要があります。それ以外の場合は、./ または "./" の任意の組み合わせで始まるかどうかを判断できます。「/」が見つからない場合は、ファイルであると想定する必要があります。このためのスクリプトをご希望ですか?

于 2008-12-12T01:38:59.580 に答える