Php търсачка във статични файлове

Ами нищо не съм променял по кода освен директорията, дадох примерен файл с класът и дума която търся като я промених в needed. Директорията се отваря, показва ми файловете (хтмл само) и предполагам търсенето нещо не е наред или това path. Ще трябва малко да променя докато намеря проблема.
 
Това path ти казвам пак', че не е проблема. Довечера пиши на лично да ти помогна. При мен работи, ти не правиш нещо като хората и ми спестяваш отново някаква информация.
 
Ето и от мен едно кодче. Поиграх си малко и мисля че отговаря на това което искаш. Не е толкова комплексно колкото на колегата @Revelation, доста по-просто е но пък върши работа. Да кажа че не е естетически издържано :D , набухал съм всичко в един метод. Ето и кода и как се ползва. Правиш си един файл Search.php и един index.php. В индекса викаш функцията сетГет и първия параметър ти е пътя до папката с хтмл-ите, вторият параметър ти е името на цсс класа в който ще търсиш и третия ти е думата която търсиш. За път до папката не е нужно да задаваш пълен път, realpath се грижи за това. При мене структурата е такава: в главната директория Search.php, index.php и папка folder1 с два хтмл-а вътре. В хтмл-ите по един <div class="simple-article"> с някакъв текст вътре. При търсене на думата text която я има и двата файла вади линкове до тези файлове. Ако искаш и текста викаш променливата $readFile. Ако няма съвпадение на търсеното не излиза нищо. Кода трябва да се барне малко, да му се сложат ерори, още някоя и друга проверка, да се раздели по методи, но съм го оставил така за да е максимално просто, за да можеш да го разбереш.


Search.php
Код:
<?php

class Search {

    public function setGet($path, $class, $searchString) {

        $fullPath = realpath($path);

        $scan = scandir($fullPath);

        $diff = array_diff($scan, array('.', '..'));

        foreach ($diff as $files) {

            $readFile = file_get_contents($fullPath . DIRECTORY_SEPARATOR . $files);

            $regexp = "<div\s[^>]*class=\"$class\"(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/div>";

            if (preg_match_all("/$regexp/siU", $readFile)) {

                $ex = explode(' ', $readFile);

                foreach ($ex as $k => $arr) {

                    if (stripos($arr, $searchString) === 0 && (strlen($arr) == strlen($searchString))) {

                        //echo $readFile . '<br>';
                        echo '<a href=' . $path . DIRECTORY_SEPARATOR . $files . '>' . $files . '</a><br>';
                        break;
                    }
                }
            }
        }
    }

}



index.php
Код:
<?php
        include 'Search.php';
        $search = new Search();
        $search->setGet('folder1', 'simple-article', 'text');
 
Hous каза:
Ами нищо не съм променял по кода освен директорията, дадох примерен файл с класът и дума която търся като я промених в needed. Директорията се отваря, показва ми файловете (хтмл само) и предполагам търсенето нещо не е наред или това path. Ще трябва малко да променя докато намеря проблема.

Понеже много нямах време днес, сега чета пак поста ти. Пиши на лично като прочетеш този пост да видим какво не действа. Съмнява ме това, което си задал да търсиш, че нещо чупи нещата. За това искам повече информация. А ако кода на терориста ти върши работа взимай него.
 
Ами до $readFile работи, показва ми съдържанието ако му дам print_r (правилните файлове .хтмл показва)
 
Ето и едно подобрение. Ако след търсената дума има някакъв препинателен знак например запетайка няма да има съвпадение, затова добавих един масив с някои препинателни знаци, също и някои тагове които да игнорира при търсенето. Можеш да си добавиш и други ако мислиш че ще са ти необходими. Кода става така:

Код:
<?php

class Search {

    public function setGet($path, $class, $searchString) {

        $fullPath = realpath($path);

        $scan = scandir($fullPath);

        $diff = array_diff($scan, array('.', '..'));

        foreach ($diff as $files) {

            $readFile = file_get_contents($fullPath . DIRECTORY_SEPARATOR . $files);

            $regexp = "<div\s[^>]*class=\"$class\"(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/div>";

            if (preg_match_all("/$regexp/siU", $readFile)) {

                $ex = explode(' ', $readFile);

                foreach ($ex as $arr) {
                    
                    $prz = array('.', ',', '!', '?', '<b>', '</b>', '<a>', '</a>', '<p>', '</p>', '<div>', '</div>', '<span>', '</span>');
                    
                    for ($i = 0; $i < count($prz); $i++) {
                        $arr = str_replace($prz[$i], '', $arr);
                    }

                    if (stripos($arr, $searchString) === 0 && (strlen($arr) == strlen($searchString))) {
                        echo $readFile;
                        echo '<a href=' . $path . DIRECTORY_SEPARATOR . $files . '>' . $files . '</a><br>';
                        break;
                    }
                }
            }
        }
    }

}
 
Не знам приятелю какви грешки ти дава, при мене всичко си работи. Грешката е в твоя телевизор :D . Най вероятно си с версия на пхп по стара от 5.4 сега прочетох че от тази версия третият параметър не е задължителен.
 
Писах ти лс да не спамя, и писах на хостинга да видя дали ще я обновят, само се надявам да не стане проблем с друг сайт заради този ъпдейт :D
 
Код:
class Search { 

    public function setGet($path, $class, $searchString) { 

        $fullPath = realpath($path); 

        $scan = scandir($fullPath); 

        $diff = array_diff($scan, array('.', '..')); 

        foreach ($diff as $files) { 

            $readFile = file_get_contents($fullPath . DIRECTORY_SEPARATOR . $files); 

            $regexp = "<div\s[^>]*class=\"$class\"(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/div>"; 

            if (preg_match("~$regexp~siU", $readFile)) { 

                $ex = explode(' ', $readFile); 

                foreach ($ex as $arr) { 

                    $prz = array('.', ',', '!', '?', '<b>', '</b>', '<a>', '</a>', '<p>', '</p>', '<div>', '</div>', '<span>', '</span>'); 

                    for ($i = 0; $i < count($prz); $i++) { 
                        $arr = str_replace($prz[$i], '', $arr); 
                    } 

                    if (stripos($arr, $searchString) === 0 && (strlen($arr) == strlen($searchString))) { 
                        echo $readFile; 
                        echo '<a href=' . $path . DIRECTORY_SEPARATOR . $files . '>' . $files . '</a><br>'; 
                        break; 
                    } 
                } 
            } 
        } 
    } 

}

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


:)

edit:Заместих array_diff($scan, array('.', '..'))
със предния код
Код:
$diff = parse_dir($dir, '*.html');
и добавих това
Код:
function parse_dir($path, $name) 
{
									$data = array();

									for ($i=0; $i < 50; $i++) {
											  $res = glob("{$path}{$name}");
											  if (count($res)) {
															$data[] = $res;
															break;
											  }
											  $path .= '*/';
											  //echo "\t{$path}<br>"; // Debug output
									}
									return $data[0];
							}
и сега търси само в .html
 
Дам от хостинга ми предложиха да я обновят, ако реша. Сега някой може ли да помогне с това как в кода да вкарам проверка на няколко (конкретни) директории? Също как да преценя, когато няма резултат? И също да кажете мнение дали това:
Код:
$search = new Search();
						if(preg_match('/^[a-z0-9 .\-]+$/i', $searchterm)) {
						   $search->setGet('.', 'simple-article', $searchterm);
						}else{
						echo "String too vulnerable";
						}

е достатъчно защитено ?
 
Няма как да ти кажем колко е защитено без да знаем къде се ползва и въобще какво очакваш да предпазиш.
 
Ето как да търсиш в повече от една директория. Пускам старите скриптове с коментар там където трябва да добавиш или промениш. Тествал съм и работи обхожда всички папки, които си задал като параметър.


Search.php
Код:
class Search {

    //Добавяме едно свойство което е масив
    public $_fullPath = array();

    public function setGet($path, $class, $searchString) {

        //Заменяме обикновената променлива със свойството
        $this->_fullPath = realpath($path);

        //Тук също
        $scan = scandir($this->_fullPath);

        $diff = array_diff($scan, array('.', '..'));

        foreach ($diff as $files) {

            //Тук също
            $readFile = file_get_contents($this->_fullPath . DIRECTORY_SEPARATOR . $files);

            $regexp = "<div\s[^>]*class=\"$class\"(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/div>";

            if (preg_match("~$regexp~siU", $readFile)) {
               
                $ex = explode(' ', $readFile);

                foreach ($ex as $arr) {

                    $prz = array('.', ',', '!', '?', '<b>', '</b>', '<a>', '</a>', '<p>', '</p>', '<div>', '</div>', '<span>', '</span>');

                    for ($i = 0; $i < count($prz); $i++) {
                        $arr = str_replace($prz[$i], '', $arr);
                    }

                    if (stripos($arr, $searchString) === 0 && (strlen($arr) == strlen($searchString))) {
                        echo $readFile;
                        echo '<a href=' . $path . DIRECTORY_SEPARATOR . $files . '>' . $files . '</a><br>';
                        break;
                    }
                }
            }
        }
    }

}



index.php
Код:
include 'Search.php';
        $search = new Search();

        //Тук си правиш един масив в който добавяш колкото искаш пътища и масива го вкарваме в цикъл за да обходи всички пътища
        $arr = array('folder1', 'folder2');
        for ($i = 0; $i < count($arr); $i++) {
            $search->setGet($arr[$i], 'simple-article', 'search');
        }
 
PHP:
function file_parser($dir, $needed, $tags, $class)
{
	$data = array();
	$class = implode('|', $class);
	$tags = implode('|', $tags);
	
	// търсим всичи файлове, които са с разширение .html
	$directories = parse_dir($dir, '*.html');
	
	if  ( sizeof($directories) > 0 ) 
	{
		foreach ( $directories as $dir )
		{
			if ( is_file($dir) )
			{
				$readFile = file_get_contents($dir);
				$readFile = preg_replace('#[\n\t]#', '', $readFile);
								
				preg_match_all("#<({$tags})\s*class=\"({$class})\">.*({$needed})#i", $readFile, $matches);

				if ( sizeof($matches[3]) ) {
					$data[] = array('link' => $dir, 'target' => $matches[3][0]);
				}
			}
		}
		
		return $data;
	}
}

$needed = "post";
$tags = array('div', 'p');
$class = array('simple-post', 'simple-article');

echo "<xmp>";
print_r(file_parser($dir, $needed, $tags, $class));

Да се надяваме, че ще работи. Пробвах с файла, който ми беше дал на ЛС, надявам се да не се чупи.
Сега ще върне първия срещнат резултат. Ако имаш няколко дива със същия клас във файла, ще върне първия резултат.
 
Revelation каза:
Няма как да ти кажем колко е защитено без да знаем къде се ползва и въобще какво очакваш да предпазиш.
Ами мислех, че се подрабира по имената. Идеята е когато се въведе нещо и се изпрати към search файла, да се направи проверка дали това което е изпратено съдържа само числа, букви тире и разстояние.
 

Back
Горе