我正在尝试抓取客户端网站主页上的所有网址,以便将其迁移到wordpress。问题是我似乎无法得到重复数据删除的网址列表。
以下是代码:
$html = file_get_contents('http://www.catwalkyourself.com');
$dom = new DOMDocument();
@$dom->loadHTML($html);
// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
for ($i = 0; $i < $hrefs->length; $i++) {
$href = $hrefs->item($i);
$url = $href->getAttribute('href');
if($url = preg_match_all('((www|http://)(www)?.catwalkyourself.com\/?.*)', $url, $matches[0])){
$urls = $matches[0][0][0];
$list = implode( ', ', array_unique( explode(", ", $urls) ) );
echo $list . '<br/>';
//print_r($list);
}
}
(同时发布here。)
相反,我得到这样的重复:
http://www.catwalkyourself.com/rss.php
http://www.catwalkyourself.com/rss.php
我该如何解决这个问题?
答案 0 :(得分:3)
现在使用循环构建代码的方式,您始终使用数组大小为1调用array_unique
。
您需要构建一个URL列表,然后调用array_unique。试试这个:
<?php
$html = file_get_contents('http://www.catwalkyourself.com');
$dom = new DOMDocument();
@$dom->loadHTML($html);
// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
$urls = array();
for ($i = 0; $i < $hrefs->length; $i++) {
$href = $hrefs->item($i);
$url = $href->getAttribute('href');
if( ($count = preg_match_all('((www|http://)(www)?.catwalkyourself.com\/?.*)', $url, $matches[0])) > 0) {
$urls[] = $matches[0][0][0]; // build list of URLs in the loop
}
}
$list = implode( ', ', array_unique( $urls ) );
echo $list . '<br/>';
答案 1 :(得分:1)
代码的最后一部分不应该在循环中。您正在遍历包含页面上每个链接的数组。由于此数组的每个元素只包含一个链接,因此您将array_unique
应用于不能包含多个元素的数组。
尝试这样的事情:
$html = file_get_contents('http://www.catwalkyourself.com');
$dom = new DOMDocument();
@$dom->loadHTML($html);
// grab all the on the page
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");
$urls = array();
for ($i = 0; $i < $hrefs->length; $i++) {
$href = $hrefs->item($i);
$url = $href->getAttribute('href');
if($url = preg_match_all('((www|http://)(www)?.catwalkyourself.com\/?.*)', $url, $matches[0])){
$urls[] = $matches[0][0][0];
}
}
$list = implode(', ', array_unique($urls));
echo $list . '<br/>';