0

人々がブログのアドレスを送信できる Web サイトを構築しています。私がやろうとしているのは、彼らがブログを送信するときに、データベースをチェックして、それが既にデータベースにあるかどうかを確認することです.

私が抱えている問題は、誰かが URL を "http://blog.com" または "http://www.blog.com" として書くことができるということです。

URLが繰り返されているかどうかを確認する最良の方法は何ですか?

URLに「http://」と「www」があるかどうかを確認し、「www」の後の部分を確認すると思いますが、3000を超えるURLがあるため、これは遅くなると思います。ありがとう!

4

3 に答える 3

1

www.blog.com2 つのまったく異なるブログである場合とそうでないblog.com 場合があります。たとえば、example.blogspot.comblogspot.comは 2 つのまったく異なるサイトです。www.は他のドメインと同様に通常のサブドメインであり、どのように動作するかについての規則はありません。ドメインに続くパスについても同じことが言えます。example.com/blorgおよびexample.com/foobarg2 つの独立したブログである場合があります。

したがって、指定された URL に対して HTTP 要求を行い、それがどこかにリダイレクトされるかどうかを確認します。通常、1 つの正規 URL があり、www.blog.comリダイレクト先blog.comまたはその逆にリダイレクトされます。そのため、curl 拡張機能またはその他のお気に入りの HTTP 要求モジュールを調べて、指定された URL に要求を行い、それが解決される正規の URL を見つけます。

parse_urlまた、スキームやクエリ パラメータなどの他の不規則性を無視して、一意の識別子として、たとえばホスト名とパスのみを使用して URL 全体を解析することもできます。

于 2012-10-15T17:44:31.947 に答える
0

Dis-calmer : これは実験的な目的のためのもので、使用したい最適なフォーマットをガイドするものと思われます

ドメインとサブドメインのみを保存する必要があると思います..この単純なスクリプトが何を意味するかを示します

画像配列

$urls = array('http://blog.com',
        'http://somethingelse.blog.com',
        'http://something1.blog.com',
        'ftp://blog.com',
        'https://blog.com',
        'http://www.blog.com',
        'http://www.blog.net',
        'blog.com',
        'somethingelse.blog.com');

あなたが実行する場合

$found = array();
$blogUrl = new BlogURL();
foreach ( $urls as $url ) {
    $domain = $blogUrl->parse($url);
    if (! $domain) {
        $blogUrl->log("#Parse can't parse  $url");
        continue;
    }

    $key = array_search($domain, $found);

    if ($key !== false) {
        $blogUrl->log("#Duplicate $url same as {$found[$key]}");
        continue;
    }

    $found[] = $domain;
    $blogUrl->log("#new $url has  $domain");
}

var_dump($found);

出力

array
  0 => string 'blog.com' (length=8)
  1 => string 'somethingelse.blog.com' (length=22)
  2 => string 'something1.blog.com' (length=19)
  3 => string 'blog.net' (length=8)

内部の働きを見たいなら

echo "<pre>";
echo implode(PHP_EOL, $blogUrl->getOutput());

出力

blog.com Found in http://blog.com
#new http://blog.com has  blog.com
somethingelse.blog.com Found in http://somethingelse.blog.com
#new http://somethingelse.blog.com has  somethingelse.blog.com
something1.blog.com Found in http://something1.blog.com
#new http://something1.blog.com has  something1.blog.com
#error domain not found in ftp://blog.com
#Parse can't parse  ftp://blog.com
blog.com Found in https://blog.com
#Duplicate https://blog.com same as blog.com
www.blog.com Found in http://www.blog.com
#Duplicate http://www.blog.com same as blog.com
www.blog.net Found in http://www.blog.net
#new http://www.blog.net has  blog.net
#Fixed blog.com to 
#Fixed http://blog.com to http://blog.com
blog.com Found in http://blog.com
#Duplicate blog.com same as blog.com
#Fixed somethingelse.blog.com to 
#Fixed http://somethingelse.blog.com to http://somethingelse.blog.com
somethingelse.blog.com Found in http://somethingelse.blog.com
#Duplicate somethingelse.blog.com same as somethingelse.blog.com

使用クラス

class BlogURL {
    private $output;

    function parse($url) {
        if (! preg_match("~^(?:f|ht)tps?://~i", $url)) {
            $this->log("#Fixed $url to ");
            $url = "http://" . $url;
            $this->log("#Fixed $url to $url");
        }

        if (! filter_var($url, FILTER_VALIDATE_URL)) {
            $this->log("#Error $url not valid");
            return false;
        }
        preg_match('!https?://(\S+)+!', $url, $matches);
        $domain = isset($matches[1]) ? $matches[1] : null;

        if (! $domain) {
            $this->log("#error domain not found in $url");
            return false;
        }
        $this->log($domain . " Found in $url");

        return ltrim($domain, "w.");
    }

    function log($var = PHP_EOL) {
        $this->output[] = $var;
    }

    function getOutput() {
        return $this->output;
    }
}
于 2012-10-15T19:14:13.947 に答える
0

いくつかの比較インターフェイス (c#) を実装する Url オブジェクトを作成します。

だからあなたはこのようにすることができます。

 var url = new Url("http://www.someblog.nl");
 var url2 = new Url("http://someblog.nl");

if (url == url2)
{
    throw new UrlNeedsToBeUniqueException();
}

いくつかの正規表現を使用して比較機能を実装するか、常に www. 比較を開始する前に、URL の一部を文字列に置き換えます。

于 2012-10-15T17:41:07.250 に答える