Поиск по сайту, поиск по файлам и вообще будем искать на сайте. Давно хотел сделать такую тему, как поиски внутри сайта, внутри файлов. В общем разобраться в теме поиска.
В самом начале давайте разберемся, где будем искать. Мы будем искать в файлах, но в принципе второй вариант, может подойти и как поиск по базе данных.
Но давайте все по порядку.
И сделаем маленькую навигацию по странице…
1. Поиск по заголовкам сайта Данный поиск мы выделили в отдельную страницу
И второй поиск – это поиск по файлам во всем сайте!
Я не буду вам разжевывать каждую строчку, а лишь расскажу алгоритм.
Получаем все ссылки, а у нас все ссылки нашего сайта есть в карте сайта XML.
Очищаем от всех тегов(preg_match_all), которые присутствуют в карте XML.
array_shift - удаляем первую ячейку - ссылка на главную, она нам не нужна, потмоу, что на ней дублруется часть заголовков, которые уже есть в карте сайта.
Далее удаляем домен во всех ссылках($ALL_pages = preg_replace($patterns, $replacements, $url[1]);).Для чего это делается!?
Мы будем использовать функцию file_get_contents для получения данных со страницы, а у неё есть некоторые нюансы.
1.
Если вы используете относительный путь до страницы http://dwweb.ru/название_страницы.html, то функция вернет полностью загруженную страницу с исполненными скриптами – а это-то, как раз нам и не нужно! Страница – тупо зависнет и попытается получить данные с 300 страниц(на момент написания статьи)… и будет висеть бесконечно!
2.
Если использовать абсолютный путь до файла
$_SERVER[“DOCUMENT_ROOT”] + путь до файла. То мы получим исходный код страницы, а у нас , кроме текста там ничего и нет, что собственно нам и нужно! Это будет загружаться намного быстрее!
Все данные привели к нижнему регистру(mb_strtolower) и поиск и линию. Далее делаем цикл, перебираем наш массив($ALL_pages) на совпадения(strpos). Считаем строки, если цикл прошел один раз прибавляем единицу($line_count), потом её выведем как количество совпадений.
Ну и далее делаем вывод и результатов поиска и сколько строк…
Смотрим собранный код, скопировать в самом низу...
Тестирем, что у нас получилось
<?php
$ALL_pages = file_get_contents('http://dwweb.ru/sitemap.xml');
preg_match_all("#<loc>(.+?)</loc>#i", $ALL_pages, $url);
//УДАЛЕМ ПЕРВУЮ ЯЧЕКУ СО ЗНАЧЕНИЕМ dwweb.ru
$fruit = array_shift($url[1]);
$patterns1 = "http:\/\/dwweb.ru\/";// что меняем
$patterns = "/$patterns1/";// что меняем
$replacements = '/';//На что менняем
$ALL_pages = preg_replace($patterns, $replacements, $url[1]); //пропускаем через функцияю замены
//print_r($ALL_pages);
$home = $_SERVER['DOCUMENT_ROOT'];
If(isset($_POST['poisk'])){ $poisk = $_POST['poisk'];}
$poisk = mb_strtolower( $poisk, 'UTF-8');
If(isset($_POST['button']))
{
for ($i = 0; $i < count($ALL_pages); $i++)
{
$new = file_get_contents($home.$ALL_pages[$i]);
$new = mb_strtolower( $new, 'UTF-8');
if (strpos($new, $poisk) !== false)
{ $line_count += 1;
$parts = explode('::', $line);
echo '<a href ="'.$ALL_pages[$i].'" target="_blank">'.$ALL_pages[$i].'</a><br>' ;
} }
if(!empty($line_count)){ $vivod_info = 'Всего найдено совпадений по запросу <strong>"'.$poisk.'"</strong> - ' . $line_count; } else { $vivod_info = 'Ничего не найдено...<br>Попробуйте изменить строку поиска.<br>Либо изменить посиковое слово';}
}
?>
<? echo $vivod_info ?>
<form method="POST" action="">
<input type="text" name="poisk" >
<input type="submit" name="button" value="ИСКАТЬ"><br>
</form></div>
Поиск по файлам №2 аналогичен "Поиск по файлам №1", с той только разницей, что выводятся названия страницы, а не ссылки.
Как это работает!?
На сайте есть файл, куда складываются некоторые данные для формирования главной http://marrex.ru/, там есть ссылки и названия страниц и нам остается только в цикле выводить части строки. И аналогичным путем ползучем все данные со всех страниц.
Не буду вдаваться во все подробности такого поиска и + совместил поиск по заголовкам и во всех файлах в один и вот, что у нас получилось.
Скрипт № 10.1. Поиск по заголовкам
Все скрипты на одной странице
Поддержка граватар