К основному контенту

Нормализация пути http ссылки php. Относительный путь в абсолютный. Парсинг ссылок


/**
 * 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 "
";

Комментарии

Популярные сообщения из этого блога

Как найти скрытые файлы на iPhone

1. Откройте папку абсолютно любую на вашем компьютере, затем нажмите вкладку «Вид», отметьте «Скрытые элементы» в разделе «Показать/скрыть», чтобы включить отображение скрытой информации.

Как сделать из брюнетки блондинку в Фотошоп CS6

Изменение цвета волос в Фотошоп – одна из самых востребованных операций при редактировании снимков людей. Есть несколько стандартных способов, например: добавление нового слоя с цветом, использование кисти с определенным режимом наложения и другие. Но эти способы малоэффективны, если нужно сделать темную шевелюру светлой. Сейчас вы узнаете, как сделать блондинку в Фотошопе из брюнетки.