0

我正在建立一个网站,人们可以在其中提交他们的博客地址。我想做的是,当他们提交博客时,让我检查数据库以查看它是否已经在数据库中。

我遇到的问题是有人可以将网址写为 "http://blog.com" 或 "http://www.blog.com" 。

我检查网址是否重复的最佳方法是什么?

我想我会检查网址是否有“http://”和“www”,并检查“www”之后的部分,但我觉得这会很慢,因为我有 3000 多个网址。谢谢!

4

3 回答 3

1

www.blog.comblog.com 可能是也可能不是两个完全不同的博客。例如,example.blogspot.comblogspot.com是两个完全不同的站点。www.与其他任何子域一样,它只是一个普通的子域,并且没有关于它应该如何表现的规则。域之后的路径也是如此;example.com/blorg并且example.com/foobarg可能是两个独立的博客。

因此,您想向给定的 URL 发出 HTTP 请求,并查看它是否重定向到某个地方。通常有一个规范的 URL,并www.blog.com重定向到blog.com或相反。因此,深入研究curl 扩展或任何其他喜欢的 HTTP 请求模块,向给定的 URL 发出请求,并找出它解析到的规范 URL。

您可能还想使用解析整个 URLparse_url并仅将主机名和路径一起作为唯一标识符,而忽略方案或查询参数等其他违规行为。

于 2012-10-15T17:44:31.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 回答
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 回答