Artykuły na każdy temat
[PHP] Zaawansowana wyszukiwarka z funkcją wyświetlania i zamieniania wyników
<?php
// Konfiguracja
$config['step'] = 1;
$config['glob_path'] = array('D:\xampp\htdocs\search');
$config['glob_flags'] = null;
$conifg['glob_pattern'] = '*.txt';
$config['search_file'] = array();
$config['search_term'] = array('#(test)#');
$config['remove_floppy_from_disks_list'] = true;
$config['show_source'] = true;
$config['show_empty_results'] = false;
$config['str_replace'] = null;
$config['preg_replace'] = null;
?>
Pierwsza zmienna, czyli $config['step'] oznacza krok, który ma zostać wykonany przez aplikację.
<?php
$config['str_replace'] = array(array('test', 'foo'), array('foo', 'bar'));
$config['preg_replace'] = array(array('#(bar)#'), array('\\1 jest emo ')); // Nie, nie mam nic do emo ;)
?>
Powyższy przykład zamienia najpierw ciąg test na foo, a następnie foo na bar. W rezultacie tam gdzie wystąpiła fraza test pojawi się magiczny bar. Używanie preg_replace() ma o tyle wyższość nad innymi metodami, że możemy wrzucać dość zawiłe wzorce, nawet z odwołaniem się do innych funkcji PHP. Skala i możliwości użycia regex są na tyle duże, że nie sposób zliczyć, w jakich celach mogą zostać użyte. Pamiętajcie tylko, że w pierwszej tablicy mamy szukane elementy, a w drugiej ich zamienniki. Oczywiście możecie sobie rozszerzyć to o wiele wariatów tworząc tablice zagnieżdżone.
<style type="text/css">
body { width: 98%; font-family: "Lucida Console"; font-size: 12px }
code { width: 100%; margin: 10px 0; padding: 5px; overflow: auto; display: block; border: 1px solid red }
em.search { background: #CEC }
</style>
<?php
/**
* @version: 1.00.00
* @author: CapaciousCore
*/
// Konfiguracja
$config['step'] = 1;
$config['glob_path'] = array('D:\xampp\htdocs\search');
$config['glob_flags'] = null;
$conifg['glob_pattern'] = '*.txt';
$config['search_file'] = array();
$config['search_term'] = array('#(test)#');
$config['remove_floppy_from_disks_list'] = true;
$config['show_source'] = true;
$config['show_empty_results'] = false;
$config['str_replace'] = null;
$config['preg_replace'] = null;
// Mała zmiana ustawień
if($config['step'] == 1 || $config['step'] == 2 || $config['step'] == 3)
{
set_time_limit(0);
ini_set('memory_limit', '32M');
}
// Wyszukiwanie
if($config['step'] == 1)
{
$start_time = get_time();
$files = array();
$targets = (!empty($config['glob_path']) ? $config['glob_path'] : get_disks($config['remove_floppy_from_disks_list']));
if(!empty($targets))
{
if(!empty($config['search_file']))
{
$counter_filters_for_file_names = count($config['search_file']);
}
for($h = 0, $how = count($targets); $h < $how; ++$h)
{
$files = array_merge($files, search_files($targets[$h], ($conifg['glob_pattern'] ? $conifg['glob_pattern'] : '*'), $config['search_file'], $counter_filters_for_file_names, $config['glob_flags']));
}
if(@file_put_contents('results.txt', serialize($files)))
{
echo 'Zapisano wyniki wyszukiwania (znaleziono: '.count($files).' plików, szukano '.round((get_time() - $start_time), 8).' sekund)';
}
else
{
echo 'Nie udało się zapisać wyników wyszukiwania';
}
}
else
{
echo 'Brak punktu lub punktów wejścia';
}
}
// Wyświetlanie wyników
else if($config['step'] == 2)
{
$data = unserialize(@file_get_contents('results.txt'));
if(!empty($data))
{
$counter_search_terms = count($config['search_term']);
for($h = 0, $how = count($data); $h < $how; ++$h)
{
$content = @file_get_contents($data[$h]);
if($content || $config['show_source'])
{
echo '<b>'.$data[$h].'</b><br>';
if($config['show_source'] && !empty($content))
{
if($counter_search_terms > 0)
{
for($i = 0; $i < $counter_search_terms; ++$i)
{
$content = preg_replace($config['search_term'], "<em>\\1</em>", $content, -1, $counter_replaced);
}
if($counter_replaced > 0 || $config['show_empty_results'])
{
echo '<pre><code>'.str_replace(array('<em>', '</em>', '</em><em>'), array('<em class="search">', '</em>', ''), htmlspecialchars($content)).'</code></pre>';
}
unset($counter_replaced);
}
else
{
echo '<pre><code>'.htmlspecialchars($content).'</code></pre>';
}
}
}
}
}
else
{
echo 'Problem z odczytem wyników wyszukiwania';
}
}
// Zastąpienie tresci
else if($config['step'] == 3)
{
$data = unserialize(@file_get_contents('results.txt'));
if(!empty($data))
{
$how_changed = 0;
$how = count($data);
for($h = 0; $h < $how; ++$h)
{
$content = @file_get_contents($data[$h]);
if($content)
{
if(!is_null($config['str_replace']))
{
$new_content = str_replace($config['str_replace'][0], $config['str_replace'][1], $content);
}
if(!is_null($config['preg_replace']) || (!empty($config['preg_replace'][0]) && !empty($config['preg_replace'][1])))
{
$new_content = preg_replace($config['preg_replace'][0], $config['preg_replace'][1], (!is_null($config['str_replace']) ? $new_content : $content));
}
if((!is_null($config['str_replace']) || !is_null($config['preg_replace'])) && $new_content !== $content)
{
if(@file_put_contents($data[$h], $new_content))
{
++$how_changed;
}
}
}
}
echo 'Spośród '.$how.' plików przetworzono '.$how_changed;
}
else
{
echo 'Problem z odczytem wyników wyszukiwania';
}
}
else
{
echo 'Nieznany krok';
}
// Funkcje pomocnicze
function search_files($path, $pattern, $search_file_names, $counter_filters_for_file_names, $flags = null)
{
$files = array();
$path .= (substr($path, -1) != DIRECTORY_SEPARATOR ? DIRECTORY_SEPARATOR : '');
$objects = glob($path.($pattern ? $pattern : '*'), $flags);
foreach($objects as $object)
{
// Plik
if(is_file($object))
{
if($counter_filters_for_file_names)
{
for($h = 0; $h < $counter_filters_for_file_names; ++$h)
{
if(preg_match($search_file_names[$h], basename($object)))
{
$files[] = $object;
break;
}
}
}
else
{
$files[] = $object;
}
}
/*
// Folder
else if($pattern != '*')
{
// @todo: Tutaj powinien być segment odpowiedzialny za filtrowanie nazw folderów lub ścieżek - jak kto woli
$new_files = search_files($object, $pattern, $search_file_names, $counter_filters_for_file_names, $flags);
if(!empty($new_files))
{
$files = array_merge($files, $new_files);
}
}
*/
}
// Przeszukiwanie folderu głównego i podfolderów
foreach(glob($path.'*', GLOB_ONLYDIR) as $subdir)
{
$new_files = search_files($subdir, $pattern, $search_file_names, $counter_filters_for_file_names, $flags);
$files = array_merge($files, $new_files);
}
return (is_array($files) ? $files : array());
}
function get_disks($remove_floppy = false)
{
// Windows
if(php_uname('s') == 'Windows NT')
{
$disks = `fsutil fsinfo drives`;
$disks = str_word_count($disks, 1);
if($disks[0] != 'Drives' && $disks[0] != 'Dyski')
{
return false;
}
unset($disks[0]); $disks[0] = 'A';
if($remove_floppy)
{
$catch[0] = array_search('A', $disks);
$catch[1] = array_search('B', $disks);
if(is_int($catch[0]))
{
unset($disks[$catch[0]]);
}
if(is_int($catch[1]))
{
unset($disks[$catch[1]]);
}
}
$disks = array_values($disks);
if(!empty($disks))
{
foreach($disks as $key => $disk)
{
$disks[$key] = $disk.':\\';
}
}
}
// Mac, Linux, Unix
else // if(php_uname('s') == 'Darwin' || php_uname('s') == 'Linux' || php_uname('s') == 'Unix')
{
$disks = glob('/*');
}
return $disks;
}
function get_time()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
?>
Komentarze
Dodaj komentarz
Todziu
Dzieki