Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Лесен начин за създаване на търсачка в сайт чрез Unix Grep
  1. Unix Grep
     
Автор  plamenSm (03.04.2008 16:14)  съобщение до автора
Погледнат  2238 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (0)  абонирай се за PHP
    Страница 1 / 1

 



Grep e вградена Unix команда, която се използва за търсене. Тази команда претърсва един или няколко текстови файла, търсейки съвпадение по зададен шаблон. По подразбиране Grep отпечатва редовете в които има съвпадение.

PHP може да стартира външни програми, тоест може и да извиква Unix команди, които са на разположение на вашия Unix или Linux сървър. Използвайки тези възможностти, можем лесно да създадем проста търсачка, която търси в рамките на сайта.

В този урок ще създадем такава търсачка. Тя ще има html форма за въвеждане на търсения стринг и PHP код за изпълнение на търсенето и извеждане на резултата. Напълно логично е да поставим тези две части в един PHP файл. По-долу е показанo съдържанието на файла. За да изпробвате примера, запишете този код във файл с разширение „.php”.


CODE
1
2
3
<?php
$searchstr = ( isSet( $_POST["searchstr"] ) ? $_POST["searchstr"] : "" );
?>

CODE
1
2
3
4
5
6
7
8
9
10
<html>
<
head><title>Grep Search-engine</title></head>
<
body>
<
h1>Grep Search-engine with PHP</h1>
<
p>
<
form action="< ?php echo '$PHP_SELF'; ?>" method="post">
<
input type="text" name="searchstr" value="< ?php echo '$searchstr'; ?>" size="20" maxlength="30"/>
<
input type="submit" value="Search!"/>
</
form>
</
p>

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
if (!empty ($searchstr)) {
   
// empty() проверява дали имаме въведен стринг за търсене
    // Ако да, извикваме grep и показваме резултата.
   
echo "<hr/> ";
   
// Извикване на grep в независим от регистъра режим за всички файлове
   
$cmdstr = "grep -i $searchstr *";
   
$fp = popen($cmdstr, "r"); // отваряме изхода от grep като pipe
   
$myresult = array (); // Тук ще запазим резултатите
   
while ($buffer = fgetss($fp, 4096)) {
       
// grep returns in the format
        // filename: line
        // So, we use split() to split the data
       
list ($fname, $fline) = split(":", $buffer, 2);
       
// we take only the first hit per file
       
if (!defined($myresult[$fname])) {
           
$myresult[$fname] = $fline;
       
}
    }
   
// Имаме резултати. Да ги изведем:
   
if (count($myresult)) {
       
echo "<ol> ";
       
while (list ($fname, $fline) = each($myresult)) {
           
echo "<li><a href=".$fname.">$fname</a> : $fline </li> ";
       
}
       
echo "</ol> ";
   
}
   
else {
       
// no hits
       
echo "Sorry. Search on <strong>$searchstr</strong> returned no results.<br/> ";
   
}
   
pclose($fp);
}
?>

CODE
1
2
</body>
</
html>


… И това е всичко! С използването на вградената команда Grep, отпада необходимостта да пишем PHP код за отваряне на файловете и търсене на съвпаденията.

Трябва обаче да отбележем, че това е прост, но не и оптимален начин за създаване на „машина” за търсене, но ще ви помогне да разберете идеята и да научите как се извикват външни програми от PHP. Примерът не е подходящ за реално използване поради факта, че при всяко търсене се създава допълнително натоварване на сървъра, тъй като е необходимо да се обходят всички документи в сайта.

Практически приложими решения са тези със създаване на сортиран списък на всички думи, които се срещат в документите от сайта. Към всяка дума се записва и местата където се срещат в сайта. Подходящо решение е това да са хиперлинкове заедно с част от текста или заглавието на документа в който се намира търсената дума. Така създадения списък може да се запише като таблица в база данни или като структуриран файл. Търсенето в индексирана таблица или сортиран структуриран файл е драстично по-бързо в сравнение с показания пример. Неудобството при този подход е, че списъкът с думите трябва да се прегенерира при всяка промяна на сайта, но с използването на подходяща програма за автоматично извличане на думите това не е чак толкова трудно.

Бележки за примера:

  • PHP_SELF е предефинирана константа, която се поддържа автоматично от PHP и връща името на текущия файл.
  • fgets() е функция която чете ред от текстов файл в стринг. Максималната дължина (по спецификацията) е 4KB (4096 символа).
  • fgetss() е подобна на fgets() с разликата, че премахва всички (ако не са зададени изключения) HTML и PHP тагове, като връща изчистен текст.
  • split() разделя на част стринг в масив от стрингове по зададен разделител (шаблон - регулярен израз) .
  • each() – функция за обхождане на масив. Заменя по-сложния синтаксис с използване на цикъл.
  • popen() / pclose() са идентични с fopen() / fclose() но работят с канали за обмен на данни (pipes).


Забележка:

В този урок под „текстов файл” следва да се разбира, че става въпрос за всеки файл, който съдържа текстови редове, включително .html и .php файлове.



Източник: bewebmaster.com



   


Ключови думи: PHP unix grep Linux търсачка сайт


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008