/**
* Created by PhpStorm.
* User: x3m-bymer
* Date: 13.12.2015
* Time: 13:17
*/
Class Links{
/*
* Извлечение ссылок из кода html
*/
function getLinks($html){
//Create a new DOM document
$dom = new DOMDocument;
@$dom->loadHTML($html);
//Get all links. You could also use any other tag name here,
//like 'img' or 'table', to extract other tags.
$links = $dom->getElementsByTagName('a');
//Iterate over the extracted links and display their URLs
$res = array();
foreach ($links as $link){
$link = $link->getAttribute('href');
if(!$link){
continue;
}
array_push($res, $link);
}
return $res;
}
function http_host($url){
$res = parse_url($url);
if(empty($res['host'])){
return false;
}
return $res['host'];
}
function resolveUrls($base, $links){
if(!is_array($links)){
return false;
}
if(empty($links)){
return false;
}
$res = array();
foreach ($links as $link) {
$link = $this->resolveUrl($base, $link);
array_push($res, $link);
}
if(empty($res)){
return false;
}
$res = array_unique($res);
return $res;
}
/*
* Преобразование относительной ссылки html в абсолютную
*/
function resolveUrl($base, $url) {
if(!$url){
return false;
}
if(!$base){
return false;
}
$base = trim($base, '/').'/';
$array_url = parse_url($url);
//Если ссылка абсолютная возвращаем ее
if(isset($array_url['scheme']) && isset($array_url['host'])){
return $url;
}
$array_base = parse_url($base);
$res = '';
if(empty($array_base['scheme']) || empty($array_base['host'])){
return false;
}
//Собираем абсолютную ссылку
$res.=$array_base['scheme'] . '://';
if(isset($array_base['user'])) {
$res .= $array_base['user'].':';
}
if(isset($array_base['pass'])) {
$res .= $array_base['pass'].'@';
}
$res.=$array_base['host'];
if(isset($array_base['port'])) {
$res .= ':'.$array_base['port'];
}
if(isset($array_url['path'])) {
//Если в относительной ссылке слеш указывает на корень сайта
if(strpos($array_url['path'],'/') === 0){
$base_path = '/';
} else {
$base_path = $array_base['path'];
}
$res .='/'.$this->_normalise($base_path.$array_url['path']);
}
if(isset($array_url['query'])){
$res.='?'.$array_url['query'];
}
return $res;
}
function externalLinks($base, $links){
if(empty($links)){
return false;
}
$res = array();
foreach($links as $link){
if($this->externalLink($base, $link)){
array_push($res, $link);
}
}
return $res;
}
function externalLink($base, $link){
$base = $this->http_host($base);
$link = $this->http_host($link);
if($link != $base){
return true;
}
return false;
}
function internalLinks($base, $links){
if(empty($links)){
return false;
}
$res = array();
foreach($links as $link){
if($this->internalLink($base, $link)){
array_push($res, $link);
}
}
return $res;
}
function internalLink($base, $link){
$base = $this->http_host($base);
$link = $this->http_host($link);
if($link === $base){
return true;
}
return false;
}
/*
* Нормализация пути
*/
function _normalise($path, $encoding="UTF-8") {
// Attempt to avoid path encoding problems.
//$path = iconv($encoding, "$encoding//IGNORE//TRANSLIT", $path);
// Process the components
$parts = explode('/', $path);
$safe = array();
foreach ($parts as $idx => $part) {
if (empty($part) || ('.' == $part)) {
continue;
} elseif ('..' == $part) {
array_pop($safe);
continue;
} else {
$safe[] = $part;
}
}
// Return the "clean" path
$path = implode('/', $safe);
return $path;
}
}
Вызов класса:
require_once "../parsePage.php";
$links = new Links();
$url = 'http://www.moneycake.biz/a/azerbaijan_baky_baku.html';
$html = file_get_contents($url);
$res = $links->getLinks($html);
$domain = $links->http_host($url);
print "";
$urls = $links->resolveUrls($url, $res);
print_r($urls);
print "Internal";
print_r($links->internalLinks($url, $urls));
print "
";
1. Откройте папку абсолютно любую на вашем компьютере, затем нажмите вкладку «Вид», отметьте «Скрытые элементы» в разделе «Показать/скрыть», чтобы включить отображение скрытой информации.
Комментарии
Отправить комментарий