28. august 2005 - 14:34Der er
12 kommentarer og 1 løsning
Omdanne links i søgemaskine
Hej hej allesammen, jeg er lidt i knibe med en søgemaskine, og håber at nogen ved hvordan man løser følgende problem.
Jeg har dette script til at søge med...
<?php
if(isset($_GET['sSearch'])) { $dir = "lalalablhablah/Pages"; //Dit HTML bibliotek
// Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if (is_file($dir . $file)) { $indhold = file_get_contents($dir . $file); $searchString = "/.{0,150}" . $_GET['search'] . ".{0,150}/si"; if (preg_match($searchString, strip_tags($indhold), $match)) { $fileName = substr($file, 0, strrpos($file, ".")); echo "<a href=\"Template_A.php?page=../Pages/" . $fileName . "\">" . $fileName . "</a> :<br> " . $match[0] . "...<br><br>"; } //Her skal vi så søge i filens indhold... Og det kan godt komme til at tage noget tid... } } closedir($dh); } else { echo "opendir failed"; } } else { echo "$dir is not a Directory"; } }
?>
Det virker også fint, når den går ind og søger i mine html filer i mappen Pages. Mit problem er bare at pages, består af forskellige mindre elementer, som bliver bundet sammen af andre sider. Så hvis jeg søger nu, finder den måske en fil ved navn "minprofil", og viser den alene. I virkeligheden skal det element sidde på en hel side med andre elementer, relateret til "minprofil".
Søge-scriptet siger jo at linket skal hedde - Template_A.php?page=../Pages/ og så + den fil den fandt
Jeg kunne selvfølgelig bare sige at linket skal lege med end anden mappe... f.eks Template_A.php?page=../Sogefix/ , og så oprette en masse filer, hvor navnene afspejler dem i Pages, men hvor indholdet redirecter til den fulde sammensatte side. Det virker dog lidt snørklet, og totalt spaghetti-agtigt...
Så jeg tænke om man måske kunne lave nogle variabler, hvor man f. eks siger, hvis den finder "minprofil", så jeg har en variabel der siger "minprofil" = den her side...
Ved overhovedet ikke om det er muligt, og som man nok kan se, er jeg totalt noob... anyways, hvis nogle kan se den "lette" løsning, så skriv gerne!!
Ok, men så ligger antallet lige omkring der hvor at jeg selv ville vælge imellem om jeg ville have oversættelses-tabellen liggende i en database eller om jeg ville have den liggende hårdkodet i PHP-koden. Hvilken løsning ville du foretrække?
<?php if (isset($_GET['sSearch'])) { $dir = "lalalablhablah/Pages"; //Dit HTML bibliotek
// Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if (is_file($dir . $file)) { $indhold = file_get_contents($dir . $file); $searchString = "/.{0,150}" . $_GET['search'] . ".{0,150}/si"; if (preg_match($searchString, strip_tags($indhold), $match)) { $fileName = substr($file, 0, strrpos($file, ".")); $fileName = trueFileName($fileName); echo "<a href=\"Template_A.php?page=../Pages/" . $fileName . "\">" . $fileName . "</a> :<br> " . $match[0] . "...<br><br>"; } // Her skal vi så søge i filens indhold... Og det kan godt komme til at tage noget tid... } } closedir($dh); } else { echo "opendir failed"; } } else { echo "$dir is not a Directory"; } }
function trueFileName($aFileName) { switch ($aFileName) { case "minProfil.php" : return "sidenHvorMinProfilIndgår.php" break; case "enAndenUnderside.php" : return "sidenHvorEnAndenUndersideIndgår.php" break; // osv. for alle 50 filer ... default : return $aFileName; // Denne fanger de tilfælde hvor vi har glemt en fil i listen. break } } ?>
Jeg ville umiddelbart tro at du kunne undvære break-sætningerne i switch'en.
Et spørgsmål: Kan siden minProfil.php indgå i mere end én af de andre filer? Altså sådan at man faktisk burde give mere end ét link når søgeteksten blev fundet i minProfil.php?
ja, du siger noget.... det har jeg ikke en gang tænkt over. DEr er sikkert nogle "sider" som vil gå igen... eller jo, det er der rent faktisk. Spørgsmålet er om det er et større problem at tilføje det?
Ikke noget større problem; Vi går bare over til at basere løsningen på et array:
<?php if (isset($_GET['sSearch'])) { $dir = "lalalablhablah/Pages"; //Dit HTML bibliotek
// Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if (is_file($dir . $file)) { $indhold = file_get_contents($dir . $file); $searchString = "/.{0,150}" . $_GET['search'] . ".{0,150}/si"; if (preg_match($searchString, strip_tags($indhold), $match)) { $fileName = substr($file, 0, strrpos($file, ".")); $fileNames = trueFileName($fileName);
foreach ($fileNames as $fileName) { echo "<a href=\"Template_A.php?page=../Pages/" . $fileName . "\">" . $fileName . "</a> :<br> " . $match[0] . "...<br><br>"; } } // Her skal vi så søge i filens indhold... Og det kan godt komme til at tage noget tid... } } closedir($dh); } else { echo "opendir failed"; } } else { echo "$dir is not a Directory"; } }
function trueFileNames($aFileName) { $trueFileNamesArr = array();
switch ($aFileName) { case "minProfil.php" : $trueFileNamesArr[] = "side1HvorMinProfilIndgår.php"; $trueFileNamesArr[] = "side2HvorMinProfilIndgår.php"; $trueFileNamesArr[] = "side3HvorMinProfilIndgår.php"; break; case "enAndenUnderside.php" : $trueFileNamesArr[] = "sidenHvorEnAndenUndersideIndgår.php"; break; // osv. for alle 50+ filer ... default : $trueFileNamesArr[] = $aFileName; // Denne fanger de tilfælde hvor vi har glemt en fil i listen. break }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.