Делаю модный поиск по сайту
Пытаюсь написать то что на самом деле нужно но периодически, возникают вопросы, на некоторые нахожу ответы а на некоторые нет вот первый, точнее не вопрос а просьба помочь с регулярным выражением или как-то по другому. Суть такова есть у нас куча HTML кода нужно в нем выбрать все ссылки с <a href=”link”>link</a> но с учетом что ссылка может быть относительная и прямая (или как назвать) – этого суть такова если относительная то подставить определенный урл.
Ну и в краце:
1. нахождение ссылок
2. отличие относительный от прямых(как отличить или что-то такое).
Код:
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";
}
$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.
Код немного переделал под то что нужно контент не надо сохранять а тока найти линки что и было сделано. Но посмотрев здесь 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; //сохраняем весь контент для роиска
?>
//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
Цитата:
не смог увидеть я метода как с HTML который был загружен вот так: $doc->loadHTMLFile("http://".$searchconf['host']); присвоить в переменную допустим $content.
$content = $doc->saveHTML();
Цитата:
вот еще ошибочка
Этих варнигов полно всегда, когда HTML парсится. Лучше их сразу отключать вначале.
Но есть несколько неудобств буду благодарен за любую помощь в решении (хоть ссылочку на то что почитать)
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 или нет – если нет то удаляет ее с базы чтобы не мешала)) причем думаю было бы рационально узнавать ответ от сервера номер ошибки там например 200 все ок идем далее, 404 – удаляем, 401 – пропускаем.
Заранее благодарен
Код:
$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);
$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);
У меня остался чистый массив с неповторяющимися значениями без всяких поосторонних символов (остались только буквы, цифры, подчёркивания - вобщем всё, из чего может быть слово).
$text = strip_tags( (trim($text), ENT_QUOTES));
$text = strip_tags(htmlspecialchars(trim($text), ENT_QUOTES));
ненадо