Търсене в TXT

dakata__92

Super Moderator
Може ли да се направи търсачка , която да търси по зададена дума или ИП адрес в текстов документ и да извежда в същата страница какво е открила ? Трабва ми за админ панел който имам :)
 
Ето един страхотен урок който ми помогна мнооого ! Само да попитам как мога да въведа още в 2 файла да търси търсачката ? :)
http://web-tourist.net/login/login/view.php?st=2558
Код:
<?php 
// CONFIG // 
$min_simb = 3; // колко символа минимум трябва да въведе потребителя 
$max_simb = 50; // колко символа максимум може да въведе потребителя 
$and_or = true; // ако оставите "true" ще връща резултати само ако съществуват всички въведени думи от потребителя, ако напишете "false" тогава ще връща резулати, в които участва поне една от думите. 
$h_g = true; // ако оставите "true" ще различава малки и големи букви, ако напишете "false" няма да прави разлика между малки и големи букви 


// Това са текстовете в, които ще се търси. Може да ги заместите с каквото пожелаете. Може да ги изкарате от файл примерно :) 
$str = array(); 
$filee = "txt/who.txt"; // тук въвеждате файла от, който ще чете. 
$razdelqne = "\n"; // тук пишете с какво да разделя резултатите от файла. По default съм го направил нов ред "\n" 

$file = file_get_contents($filee); 
$razdel = explode($razdelqne,$file); 
foreach ($razdel as $info) { 
$str[] = $info; // тук записваме информацията в масив 
}

// Формата за търсене 
echo "<form action=\"\" method=\"post\">"; 
echo "Търси: <input type=\"text\" name=\"searches\" size=\"50\" maxlength=\"$max_simb\"> <input type=\"submit\" name=\"submit\" value=\"Търси\">"; 
echo "</form>"; 

if (isset($_POST['submit']) && !empty($_POST['searches'])) { // ако е натиснат бутона и е въведено нещо в формата продължаваме 
if (strlen($_POST['searches']) >= $min_simb && strlen($_POST['searches']) <= $max_simb) { // ако сме спазили минимални и максималния брой символи за търсене продължаваме 
$search = array(); // създаваме празен масив 

$razd = explode(" ",$_POST['searches']); // разделяме въведеното от потребителя на думи 
foreach ($razd as $s) { 
$search[] = $s; // вкарваме думите в по-горе създадения масив 
} 

for ($i=0;$i<count($str);$i++) { // започваме цикъл със всички текстове 
if ($and_or) { $searched = 1; } else { $searched = 0; } // създаваме променлива, която ще играе важна роля по-долу при определяне на резултатите 
foreach($search as $value) { 
if ($h_g) { str_replace($value,'',$str[$i],$count); } else { str_ireplace($value,'',$str[$i],$count); } // тук определяме дали да различава малките и големи букви или не 

if ($and_or) { // ако сме избрали да връща резултати само ако съществуват всички въвдени думи 
if ($count == 0) { 
$searched = 0; 
break; 
} 
} else { 
if ($count >= 1) { // ако сме избрали да връща резултати дори и да съвпада една от въведените думи 
$searched = 1; 
break; 
} 
} 
} 
if ($searched == 1) { 
$result[] = $i; // записваме в нов масив върнатите резултати 
} 
} 


// тука вече изкарваме резултатите на екрана :) 
if (count($result) >= 1) { 
if (count($result) == 1) { $res = "резултат"; } else { $res = "резултати"; } 
echo "Търсенето Ви върна <b>".count($result)."</b> $res!<br /><br />"; 
$n=1; 
foreach($result as $key) { 
echo $n.". <b>".$str[$key]."</b><br />"; 
$n++; 
} 
} else { 
echo "Търсенето Ви НЕ върна резултати!"; 
} 
} else { echo "Трябва да въведете от <b>$min_simb</b> до <b>$max_simb</b> символа!"; } 
} 
?>
 
Вместо $filee да съдържа един файл, направи го масив. След това, малко по-надолу, вместо да взимаш съдържанието само на един файл, взимаш съдържанието на всички файлове:

PHP:
$filee = array("txt/who.txt", "txt/why.txt", "txt/when.txt", "txt/where.txt");

$razdelqne = "\n"; // тук пишете с какво да разделя резултатите от файла. По default съм го направил нов ред "\n"

foreach($filee as $fe){
    $file = file_get_contents($fe);
    $razdel = explode($razdelqne,$file);
    foreach ($razdel as $info) {
        $str[] = $info; // тук записваме информацията в масив
    } 
}

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

PHP:
foreach($filee as $fe){

     $handle = fopen($fe, 'r');

     while(($row = fgets($handle)) !== false){
          //търсиш дали думите ги има на този ред
     }
     
     fclose($handle);
}
 
Файлчетата не са големи :) Мерси много първия код върши идеална работа който си показал . + 1
 

Back
Горе