我正在建立一个人们可以提交博客地址的网站。我想要做的是,当他们提交博客时,我会检查数据库,看看它是否已经存在于数据库中。
我遇到的问题是有人可以将网址写成“http://blog.com”或“http://www.blog.com”。
检查网址是否重复的最佳方式是什么?
我认为我会检查网址是否有“http://”和“www”,并检查“www”之后的部分,但我觉得这会很慢,因为我有超过3000个网址。谢谢!
答案 0 :(得分:1)
www.blog.com
和blog.com
可能或者可能不是两个完全不同的博客。例如,example.blogspot.com
和blogspot.com
是两个完全不同的网站。 www.
只是一个普通的子域,就像其他任何子域一样,并且没有关于它应该如何表现的规则。域名之后的路径也是如此; example.com/blorg
和example.com/foobarg
可能是两个独立的博客。
因此,您希望对给定的URL发出HTTP请求,并查看它是否在某处重定向。通常会有一个规范网址,www.blog.com
重定向到blog.com
或相反。因此,深入了解curl extension或任何其他喜欢的HTTP请求模块,以便对给定的URL发出请求,并找出它解析到的规范URL。
您可能还想使用parse_url
解析整个URL,并且仅将主机名和路径一起作为唯一标识符,忽略其他不规则性,例如方案或查询参数。
答案 1 :(得分: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的部分。
答案 2 :(得分: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;
}
}