Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Делаю модный поиск по сайту

477
26 мая 2007 года
Robinnovich
182 / / 02.12.2006
Много чего попробовал из готовых решений не подошло.
Пытаюсь написать то что на самом деле нужно но периодически, возникают вопросы, на некоторые нахожу ответы а на некоторые нет вот первый, точнее не вопрос а просьба помочь с регулярным выражением или как-то по другому. Суть такова есть у нас куча HTML кода нужно в нем выбрать все ссылки с <a href=”link”>link</a> но с учетом что ссылка может быть относительная и прямая (или как назвать) – этого суть такова если относительная то подставить определенный урл.
Ну и в краце:
1. нахождение ссылок
2. отличие относительный от прямых(как отличить или что-то такое).
8
26 мая 2007 года
mfender
3.5K / / 15.06.2005
Вот тебе простой пример по твоим двум вопросам:
Код:
define("MY_HOST", "forum.codenet.ru");
$doc = new DOMDocument();
$doc->loadHTMLFile("http://forum.codenet.ru/showthread.php?t=38806");
$links = $doc->getElementsByTagName("a");
for ($i = 0; $i < $links->length; $i++){
    $preparedLink = MyLink(MY_HOST, parse_url($links->item($i)->getAttribute("href")));
    $links->item($i)->setAttribute("href", $preparedLink);
}
echo $doc->saveHTML();
 
function MyLink($MyHost, $PLink, $Scheme = "http://"){
    if(!isset($PLink["host"])){
        $PLink["host"] = $MyHost;
    }
    $path = $PLink["path"] ? $PLink["path"] : "";
    $query = $PLink["query"] ? "?{$PLink["query"]}" : "";
    $fragment = $PLink["fragment"] ? "#{$PLink["fragment"]}" : "";
    return $Scheme . $PLink["host"] . $path . $query . $fragment . "\n";
}


Т.е., сначала мы выбираем из документа все ссылки (точнее их аттрибут href). С помощью функции приводим их все к абсолютному виду и записываем обратно в аттрибуты href. На выходе получаем документ, где все относительные ссылки заменены на абсолютные с хостом, указанным в константе MY_HOST.
477
26 мая 2007 года
Robinnovich
182 / / 02.12.2006
Интересно сделано это первый раз увидел такой код если бы не переменные с символом $ подумал бы что это JS, конечно стыдно но факт ).
Код немного переделал под то что нужно контент не надо сохранять а тока найти линки что и было сделано. Но посмотрев здесь http://ua2.php.net/dom методы ДОМ не смог увидеть я метода как с HTML который был загружен вот так: $doc->loadHTMLFile("http://".$searchconf['host']); присвоить в переменную допустим $content.

Код:
<?php

     //configuration
     $searchconf['host']="kassel4russian.info/";
     //------------------------------------------------
     function utf8decode($str, $encode="windows-1251"){
              return iconv("UTF-8", $encode, $str);
     }
     
     function MyLink($MyHost, $PLink, $Scheme = "http://"){
              if(!isset($PLink["host"])){
                 $PLink["host"] = $MyHost;
          }
              $path = $PLink["path"] ? $PLink["path"] : "";
              $query = $PLink["query"] ? "?{$PLink["query"]}" : "";
              $fragment = $PLink["fragment"] ? "#{$PLink["fragment"]}" : "";
     return $Scheme . $PLink["host"] . $path . $query . $fragment . "\n";
     }

     $doc = new DOMDocument();
     $doc->loadHTMLFile("http://".$searchconf['host']);
     $links = $doc->getElementsByTagName("a");
     for ($i = 0; $i < $links->length; $i++){
          $preparedLink = MyLink($searchconf['host'], parse_url($links->item($i)->getAttribute("href")));
          echo utf8decode($preparedLink)."<br>";    //заносим в bd
     }
     

     $content = strip_tags(trim($content), ENT_QUOTES);
     echo $content; //сохраняем весь контент для роиска
?>


P.S. очень благодарен за код. Код хорош и навел на размышления (так бы и не знал что можно такое творить на пхп)

вот еще ошибочка
Цитата:
Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: htmlParseEntityRef: expecting ';' in http://kassel4russian.info/, line: 66 in C:\server\root\search.php on line 21

8
26 мая 2007 года
mfender
3.5K / / 15.06.2005
Цитата:
не смог увидеть я метода как с HTML который был загружен вот так: $doc->loadHTMLFile("http://".$searchconf['host']); присвоить в переменную допустим $content.


$content = $doc->saveHTML();

Цитата:
вот еще ошибочка


Этих варнигов полно всегда, когда HTML парсится. Лучше их сразу отключать вначале.

477
27 мая 2007 года
Robinnovich
182 / / 02.12.2006
Вот как бы и закончил поиск свой.
Но есть несколько неудобств буду благодарен за любую помощь в решении (хоть ссылочку на то что почитать)

1. это фильтрация получаемого контента.
Принцип такой что загружается HTML код с него выбираются ссылки и если ее нету в базе она сохраняется для дальнейшей индексации страниц. После чего фильтрирую весь HTML вот так
$text = strip_tags( (trim($text), ENT_QUOTES));
$text = strip_tags(htmlspecialchars(trim($text), ENT_QUOTES));
Чтобы 100% нечего не осталось.
Но всеравно в тексте остается javascript вот пример
Цитата:

Новости function showloadming(param{ vc = document.getElementsByTagName(document.compatMode document.compatMode= CSS1Compat )? HTML: BODY [0; if (param=true{ document.getElementById( dv1.style.height=vc. document.getElementById( dv1.style.width=vc. document.getElementById( dv1.style.display = block; document.getElementById( dv2.style.display = block; } else { document.getElementById( dv1.style.display = none; document.getElementById( dv2.style.display = none; } Loading. Главная | Новости | Рекомендовать | Обратная связь Навигация Главная Профиль Новости Опросы Поиск Рекомендовать Обратная связь Файлы Новая версия Firefox 2 Завоевавший множество наград веб-браузер стал ещё быстрее,



2. Было бы неплохо знать как заставить скрипт парсера передавать определенный User-Agent чтобы сайт это понял и выдавал облегченную страничку и подгружая блоки и баннеры ну и все такое

Ну и напоследок: можно ли узнать существует ли такой url или нет. Это для того когда поиск а точнее робот (так можно назвать) лазит по ссылкам с базы данных проверяет есть ли такой url или нет &#8211; если нет то удаляет ее с базы чтобы не мешала)) причем думаю было бы рационально узнавать ответ от сервера номер ошибки там например 200 все ок идем далее, 404 &#8211; удаляем, 401 &#8211; пропускаем.

Заранее благодарен

8
28 мая 2007 года
mfender
3.5K / / 15.06.2005
По первому вопросу, попробуй так:
Код:
$doc = new DOMDocument();
$doc->loadHTMLFile("http://forum.codenet.ru/showthread.php?t=38806");
$all = $doc->getElementsByTagName("script");
for ($i = 0; $i < $all->length; $i++){
    $all->item($i)->remove;
}
$res = strip_tags($doc->saveHTML());
$res = preg_replace("/[^\w\d-]/", " ", $res);
$res = preg_replace("/\x20{2,}/", " ", $res);
$res = explode(" ", $res);
$res = array_unique($res);
print_r($res);

У меня остался чистый массив с неповторяющимися значениями без всяких поосторонних символов (остались только буквы, цифры, подчёркивания - вобщем всё, из чего может быть слово).
477
28 мая 2007 года
Robinnovich
182 / / 02.12.2006
да сработало даже
$text = strip_tags( (trim($text), ENT_QUOTES));
$text = strip_tags(htmlspecialchars(trim($text), ENT_QUOTES));
ненадо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог