Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылки, относительные к заданной 
:(
    Опции темы
Dr.Wisdom
Дата 17.2.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



Введение: Темы похожие есть, но ответов там нет, поэтому я решил создать тему, потому что все таки она отличаеться.

Проблема: Ссылки бывают
"http:/www.ww.ru/dir/file.ext"
"http:/www.ww.ru/dir/"
"http:/www.ww.ru/dir"
dir
dir
./dir
etc
и они могут лежать на родительских страницах вида
www.ww.ru
"http:/www.ww.ru/dir/file.ext"
"http:/www.ww.ru/dir/"
"http:/www.ww.ru"
"http:/www.ww.ru/dir"
etc

вобщем черти скока вариантов

воооот.....
а хочеться преобразовать любую такую ссылку в абсолютную. 
тоетсь функцию типа

Код

function make_subink($url, $parent)
{
//somecode
retutn $link;
}


но тут возникают вопросы
в основном они касаються всевозможных видов ссылки и родительской ссылки
их там тонна вариантов

Вопрос:
что можете посоветовать?
как?
ну или хотябы литературу по вариантам.....


Наработки:
Вот есть гонючая функция которая поидее (теоретически) должна это делать
некоторое время назад я ее прогонял по разным вариантам
она вроди работает для самой полной родительской ссылки.
Код

function make_subink($url, $parent)
{
    $p = parse_url($parent);
    $u = parse_url($url);
    
    if(!empty($u['scheme'])) return $url;    //типа уже абсолютная

    $pp = pathinfo($p['path']);
    $up = pathinfo($u['path']);
    
    if(empty($u['path'])) $up['basename'] = $pp['basename'];    //на случай передаси всяких ?asd=asd

    $dir = "/".$pp['dirname']."/".$up['dirname']."/";         //сочленить директории

    if(empty($u['query'])) $query = ""; else $query = "?".$u['query'];          // она самая ?фыв=фыв
    if(empty($u['fragment'])) $fragment = ""; else $fragment = "#".$u['fragment'];    
    
    $new_url = $p['host']."/".$dir."/".$up['basename'];
    do
    {
        $old_url = $new_url;
        $new_url = ereg_replace('[^\/]+\/+\.\.',"",$old_url);         // убить переходы типа /dir1/dir2/../ => dir1/
    }
    while( $new_url != $old_url );

    $new_url = str_replace('./',"/",$new_url);               //убить ./
    $new_url = ereg_replace('\/+',"/",$new_url);        // уьить все накопившиеся повторения //
    
    return $p['scheme']."://".$new_url.$query.$fragment;     // соединить куски
}

но она совершенно сразу дохнет для других типов родителя

Цель:
Может кто делел...
Велосипед не изобретать....
Может вообще стандартная функция такая есть....



Это сообщение отредактировал(а) Dr.Wisdom - 17.2.2007, 21:32
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
mishaSL
Дата 17.2.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Стандартной функции нет.

Не забудь еще про тег <base>.

Добавлено @ 22:28 
Посмотри вот эту тему:
http://forum.vingrad.ru/index.php?showtopi...t&p=1022357

Ustas, выложил своего робота для индексации сайта, думаю он это учел.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Dr.Wisdom
Дата 17.2.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



<base> это плохо. но думаю я с ним справлюсь....
плохо то, что его вставляют так: когда в голову взбредет тогда и поставил, а потом все линки с этого места начинаються с переданного родителя

мерзкая вещичка
а ее ктонить щас использует?
ееееее..... жжжуть... код увеличт вдвое....



Про паука Ustas-а:

Чегойто я там не нашел ничего
Все выглядит так, словно он подразумевает, что получает ссылки уже в абсолютном виде.

вот функция в которой он ищет ссылки на странице.
регулярное выражение возвращает ТОЛЬКО абсолютные урлы (я даже проверил на всякой случай хотя и так видно)

Код

    private function get_url( $url )
    {
        static $iteration = 0;
        
        $this->std( "\nПолучение текущей ссылки: ".$url );
        
        // Получаем страницу
        if ( $content = $this->get_page( $url ) ) {
            
            // Собираем с нее ссылки
            preg_match_all('#href\s*=\s*\"((?:http:\/\/|www\.)(?:[A-Za-z0-9\-\.]+)\.(?:com|ru|info|org|ua))?([A-Za-z0-9\-\_\/\~\%\.]+(?:\.html|\.htm|\/))\"#isU', $content, $matches);
            unset($content);
            
            $size = sizeof( $matches[2] );
            
            for ( $i = 0; $i < $size; $i++ ) {
                // Проверяем, если эта страница с другого хоста, то нах...
                // нам нужен только этот сайт, чтобы себе в базу весь инет не впихнуть ))
                if ( ! empty( $matches[1][ $i ] ) ) {
                    
                    if ( ! preg_match( '#'.$this->host.'#is', $matches[1][ $i ] ) ) {
                        
                        unset( $matches[2][ $i ] );
                        continue;
                    }
                }
            }
            
            $items = array_values( $matches[2] );
            
            return (array) $items;
        }
    }

(std ничего нам нужного не делает а get_page работает как file_get_content)

на странице 
Код

<a href="index.php?part=entry1">file</a><br>
<a href="index.php?part=entry2">part</a><br>
<a href="index.php?part=entry3">grab</a>

он не нашел ни одной ссылки


так что вопрос открыт

Это сообщение отредактировал(а) Dr.Wisdom - 18.2.2007, 00:12
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
Dr.Wisdom
Дата 18.2.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 6.1.2005

Репутация: нет
Всего: 0



Врбщем я апдейтил свою функцию
теперь она успешно совмещяет следующие ссылки и родителей
Код

$par = array
(
"http://wisdom.host.ru/",
"http://wisdom.host.ru/index.php",
"http://wisdom.host.ru",
"http://wisdom.host.ru/dir",
"http://wisdom.host.ru/dir/",
"http://wisdom.host.ru/dir/index.php",
"http://wisdom.host.ru/dir/no_index.php",
"http://wisdom.host.ru/dir1/dir2",
"http://wisdom.host.ru/dir1/dir2/",
"http://wisdom.host.ru/dir1/dir2/file.html",
"http://wisdom.host.ru/dir1/dir2/dir3",
"http://wisdom.host.ru/dir1/dir2/dir3/dir4"
);

$link = array
(
"file2.php#mark",
"./file2.php",
"../file2.php",
"../../../file2.php",
"path2/file2.php",
"/path2/file2.php",
"./path2/file2.php",
"../path2/file2.php",
"?qw=as"
);


Люди, подумайте какие могут встречаться извращенные линки? Я про значение href.
И еще какими способами можно задавать адрес страницы?
И еще. Нужнв строка, которая заведомо не встречаеться в адресе
я взял    
Код

$no_url_symbols = "???###";

Это верно?


вот моя функция
Код

function make_sublink($url, $parent)
{
    $no_url_symbols = "???###";
    
    $p = parse_url($parent);
    $u = parse_url($url);
    
    if(!empty($u['scheme'])) return $url;        //типа уже абсолютная

    $pp = pathinfo($p['path']);
    $up = pathinfo($u['path']);
    
    if(empty($u['path'])) // линки вида ?qw=as или #mark
    {
        $up['basename'] = $pp['basename'];    
        $up['extension'] = $pp['extension'];            
    }

    $dir = "/".$pp['dirname'];
    if(empty($pp['extension'])) $dir .= "/".$pp['basename'];    // если не указан файл, то часть пути становиться именем
    $dir .= "/".$up['dirname']."/";                                

    if(empty($u['query'])) $query = ""; else $query = "?".$u['query'];
    if(empty($u['fragment'])) $fragment = ""; else $fragment = "#".$u['fragment'];        //сформировали куски урлы dir, query и fragment
    
    if(empty($up['extension']))$up['basename'] .= '/';            // на случай если указанна папка а не файл

    $new_url = "/".$dir."/".$up['basename'];            //    новый путь файла
    $new_url = str_replace("\\","/",$new_url);            // заменить \ на / (иногда возникают)

    do                // убрать все переходы "на уровень вверх" (../) с заглушкой для остановки в случает дохода до конца
    {
        $old_url =    $no_url_symbols."/".$new_url;
        $new_url = ereg_replace('[^\/.]+\/+\.\.',"",$old_url);
    }    
    while( $new_url != $old_url );
    
    $new_url = $p['host'].$new_url;                //соединяем с хостом
    $new_url = str_replace($no_url_symbols,"",$new_url);    // убираем нашу заглушку
    $new_url = str_replace('./',"/",$new_url);        // избавляемся от папки "эта папка" (./)
    $new_url = ereg_replace('\/+',"/",$new_url);    // избавляемся от двойных слешей

    return $p['scheme']."://".$new_url.$query.$fragment; // форминуем результат
}


Добавлено @ 12:12 
ЗЫ. над тегом <base> я пока не думал

Это сообщение отредактировал(а) Dr.Wisdom - 18.2.2007, 12:22
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.