Avatar billede 4us.dk Nybegynder
20. november 2003 - 12:00 Der er 20 kommentarer og
1 løsning

Lave en søgning på en side som søger via parsing eller lign.

Hej Eksperter!

Jeg har en forespørgsel


Jeg har en del sider, (300 ca.) som alle er i HTML format i samme mappe eller i undermapper som soeg.php kommer til at findes i.

Er det muligt at lave en søgning fil (soeg.php) som kan parse alle de HTML sider igennem og lede efter specielle ord, eller sætninger (AND/OR), og så udskrive en række med links til de sider som indeholder ordene.

Hvis ja, hvordan laves sådan en?
Tak

PS: Jeg er villig til at betale lidt for at en eller anden kan lave dette, hvis interesseret.
Avatar billede 4us.dk Nybegynder
20. november 2003 - 15:14 #1
Sover eksperterne rævesøvn? ;)
Avatar billede detox Nybegynder
21. november 2003 - 01:20 #2
Jeg tror jeg vil lave en lille form som fx denne:

----------
'valg.htm'
----------

<html>
<head>
<title> titel </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form action="find.php" method="post">
  S&oslash;geord:
  <input name="search" type="text" />
  <input name="send" type="submit" value="OK" />
</form>
</body>
</html>

og så tjekke sådan her:

----------
'find.php'
----------

<?
if (isset($_POST['search']) && $_POST['search'] != "") {
    $search = $_POST['search'];
    $sti = ".";//Sti til mappe her
    getDirList($sti);
foreach ($filelist as $file) {
    $fil = tjek($file, $search);
    if ($fil != "") $files[] = $fil;
}
foreach ($files as $fil) {
    echo $fil."<br />";
}
}else{
header("Location: valg.htm");
}

function tjek($fil, $find) {
    $str = file_get_contents($fil);
    $pat = "|{$find}|";
    if (preg_match($pat, $str)) {
        return $fil;
    }
}

function getDirList ($dirName) {
global $filelist;
$d = dir($dirName);
while($entry = $d->read()) {
    if ($entry != "." && $entry != "..") {
        if (is_dir($dirName."/".$entry)) {
            getDirList($dirName."/".$entry);
        } else {
            $path = pathinfo($entry);
            if (isset($path['extension']) && $path['extension'] == "htm") {
                $filelist[] = $dirName."/".$entry;
            }
        }
    }
}
$d->close();
}
?>
Avatar billede detox Nybegynder
21. november 2003 - 01:21 #3
Nå ja, det var så et svar ;o)
Avatar billede detox Nybegynder
21. november 2003 - 01:22 #4
Her regner jeg med filer der ender på .htm
Har du andre endelser på dine HTML filer, skal det selvfølgelig rettes til.
Avatar billede 4us.dk Nybegynder
21. november 2003 - 11:11 #5
Detox:

Når jeg prøver i $sti at sætte den lig "mappenavn"

Så får jeg fejl:
Warning: Invalid argument supplied for foreach() in /var/www/epoxy/vip/csgdk/docs/find.php on line 6

Warning: Invalid argument supplied for foreach() in /var/www/epoxy/vip/csgdk/docs/find.php on line 10

Gør jeg noget forkert, eller skal det være serverens sti? noget med $_SERVER['DOCUMENT_ROOT'] eller lign?
Avatar billede 4us.dk Nybegynder
21. november 2003 - 11:13 #6
Document_root ser heller ikke ud til at hjælpe på fejlen.

Er det ikke muligt bare at sige at der hvor filen er, skal den søge+undermapperne?

i .htm og .html filerne
Avatar billede detox Nybegynder
21. november 2003 - 11:16 #7
Jo, du skal bare lade den her være:

$sti = ".";//Sti til mappe her
Avatar billede detox Nybegynder
21. november 2003 - 11:18 #8
Prøv med den her, der tjekker både 'htm' og 'html':

<?
if (isset($_POST['search']) && $_POST['search'] != "") {
    $search = $_POST['search'];
    $sti = ".";//Sti til mappe her
    $tilladt = array('htm', 'html');
    getDirList($sti);
foreach ($filelist as $file) {
    $fil = tjek($file, $search);
    if ($fil != "") $files[] = $fil;
}
foreach ($files as $fil) {
    echo $fil."<br />";
}
}else{
header("Location: test3.php");
}
function tjek($fil, $find) {
    $str = file_get_contents($fil);
    $pat = "|{$find}|";
    if (preg_match($pat, $str)) {
        return $fil;
    }
}

function getDirList ($dirName) {
global $tilladt;
global $filelist;
$d = dir($dirName);
while($entry = $d->read()) {
    if ($entry != "." && $entry != "..") {
        if (is_dir($dirName."/".$entry)) {
            getDirList($dirName."/".$entry);
        } else {
            $path = pathinfo($entry);
            if (isset($path['extension']) && in_array($path['extension'], $tilladt)) {
                $filelist[] = $dirName."/".$entry;
            }
        }
    }
}
$d->close();
}
?>
Avatar billede detox Nybegynder
21. november 2003 - 11:41 #9
Jeg kan forstå du gerne vil kunne søge på flere ord og have links ud. Jeg har rettet den lidt til så du kan adskille søgeord med |


<?
if (isset($_POST['search']) && $_POST['search'] != "") {
    $search = $_POST['search'];
    $sti = ".";//Sti til mappe her
    $tilladt = array('htm', 'html');
    getDirList($sti);
foreach ($filelist as $file) {
    $fil = tjek($file, $search);
    if ($fil != "") $files[] = $fil;
}
if (isset($files)) {
    foreach ($files as $fil) {
        echo "<a href='".$fil."'>".$fil."</a><br />";
    }
}else{
    echo "Ingen filer fundet!";
}
}else{
header("Location: test3.php");
}
function tjek($fil, $find) {
    $str = file_get_contents($fil);
    $pat = "/{$find}/";
    if (preg_match($pat, $str)) {
        return $fil;
    }
}

function getDirList ($dirName) {
global $tilladt;
global $filelist;
$d = dir($dirName);
while($entry = $d->read()) {
    if ($entry != "." && $entry != "..") {
        if (is_dir($dirName."/".$entry)) {
            getDirList($dirName."/".$entry);
        } else {
            $path = pathinfo($entry);
            if (isset($path['extension']) && in_array($path['extension'], $tilladt)) {
                $filelist[] = $dirName."/".$entry;
            }
        }
    }
}
$d->close();
}
?>
Avatar billede detox Nybegynder
21. november 2003 - 11:50 #10
Nå, jeg kommer til at løbe om lidt. Håber du kan få det til at virke.
Avatar billede 4us.dk Nybegynder
21. november 2003 - 12:25 #11
Den ser ud til at virke. :)

Er det muligt at udskrive "titel" på side, i stedet for filnavnet?
og kan man ikke lave " " (mellemrum) eller + tegn i stedet for | (det er ikke alle som kan det tegn)

Tak ;)
Avatar billede detox Nybegynder
22. november 2003 - 00:37 #12
Titlen tror jeg ikke er så nem. Ikke mindst fordi det ikke er altid en html-fil har en titel. Men hvad med fx filnavnet uden sti og extension. Jeg har erstattet | med +
Avatar billede detox Nybegynder
22. november 2003 - 00:37 #13
<?
if (isset($_POST['search']) && $_POST['search'] != "") {
    $search = $_POST['search'];
    $search = ereg_replace("\+", "|", $search);
    $sti = ".";//Sti til mappe her
    $tilladt = array('htm', 'html');
    getDirList($sti);
if (isset($filelist)) {
foreach ($filelist as $file) {
    $fil = tjek($file, $search);
    if ($fil != "") $files[] = $fil;
}
if (isset($files)) {
    foreach ($files as $fil) {
        $name = basename($fil);
        $arr = explode(".", $name);
        array_pop($arr);
        $name = implode(".", $arr);
        echo "<a href='".$fil."'>".$name."</a><br />";
    }
}else{
    echo "Ingen filer fundet!";
}
}else{
    echo "Ingen filer af den rette type!";
}
}else{
header("Location: test3.php");
}
function tjek($fil, $find) {
    $str = file_get_contents($fil);
    $pat = "/{$find}/i";
    if (preg_match($pat, $str)) {
        return $fil;
    }
}

function getDirList ($dirName) {
global $tilladt;
global $filelist;
$d = dir($dirName);
while($entry = $d->read()) {
    if ($entry != "." && $entry != "..") {
        if (is_dir($dirName."/".$entry)) {
            getDirList($dirName."/".$entry);
        } else {
            $path = pathinfo($entry);
            if (isset($path['extension']) && in_array($path['extension'], $tilladt)) {
                $filelist[] = $dirName."/".$entry;
            }
        }
    }
}
$d->close();
}
?>
Avatar billede 4us.dk Nybegynder
25. november 2003 - 11:52 #14
Okay, det ser godt ud.

Jeg har lige et par spørgsmål:
1. kan det ikke laves at man kan udelukke et par sider (hvis nu man har frames, og man ikke vil have top.html og bund.html med, eksepelvis) altså et ikke_tilladte filer ;)

2. er det muligt at man kan udskrive mappe navnene? jeg har for eksepelvis
/billeder/jokes/filnavn.html
/billeder/jokes/filnavn2.html

/mappe1/filer/filnavn.html

/mappe2/filnavn.html

Kan den så udskrive:
<b>Mappe: billeder : jokes</b>
- filnavn.html
- filnavn2.html

<b>Mappe: mappe1 : filer</b>
- filnavn.html

<b>Mappe: mappe2</b>
- filnavn.html

Jeg ved ikke helt om du forstår det, men det håber jeg, kunne virkelig godt tænke mig den bare virker helt ;)
Avatar billede detox Nybegynder
25. november 2003 - 16:20 #15
Det er lidt svært at lave ordentligt. Jeg tror punkt 1 er klaret, men nr. 2 er lidt svært at lave ordentligt så sent i forløbet. Jeg har lavet så den viser HOME/ + mapper, men jeg kan ikke få den sorteret rigtigt når det gælder HOME/.
Det havde nok været nemmere, hvis du havde forklaret det rigtigt fra starten ;o)


<?
if (isset($_POST['search']) && $_POST['search'] != "") {
    $search = $_POST['search'];
    $search = ereg_replace("\+", "|", $search);
    $sti = ".";//Sti til mappe her
    $tilladt = array('htm', 'html');
    $forbudt = array('top.htm', 'top.html', 'bund.htm', 'bund.html');
    getDirList($sti);
    if (isset($filelist)) {
        foreach ($filelist as $file) {
            $fil = tjek($file, $search);
            if ($fil != "") $files[] = $fil;
        }
        if (isset($files)) {
            sort($files, SORT_STRING);
            $tmpdir = "";
            foreach ($files as $fil) {
                $part = short($fil);
                if ($part['dir'] != $tmpdir) echo $part['dir']."<br />";
                echo "<a href='".$fil."'>".$part['name']."</a><br />";
                $tmpdir = $part['dir'];
            }
        }else{
            echo "Ingen filer fundet!";
        }
    }else{
        echo "Ingen filer af den rette type!";
    }
}else{
    header("Location: test3.php");
}

// Funktioner
function short($fil) {
    $parts = pathinfo($fil);
    $base = $parts["basename"];
    $part['dir'] = substr($parts["dirname"],1,strlen($parts["dirname"]));
    if ($part['dir'] == "") $part['dir'] = "/";
    $part['dir'] = "HOME".$part['dir'];
    $arr = explode(".", $base);
    array_pop($arr);
    $part['name'] = implode(".", $arr);
    return $part;
}

function tjek($fil, $find) {
    $str = file_get_contents($fil);
    $pat = "/{$find}/i";
    if (preg_match($pat, $str)) {
        return $fil;
    }
}

function getDirList ($dirName) {
    global $tilladt;
    global $forbudt;
    global $filelist;
    $d = dir($dirName);
    while($entry = $d->read()) {
        if ($entry != "." && $entry != "..") {
            if (is_dir($dirName."/".$entry)) {
                getDirList($dirName."/".$entry);
            } else {
                $path = pathinfo($entry);
                if (isset($path['extension']) && in_array($path['extension'], $tilladt)) {
                    if (!in_array($path['basename'], $forbudt)) {
                        $filelist[] = $dirName."/".$entry;
                    }
                }
            }
        }
    }
$d->close();
}
?>
Avatar billede detox Nybegynder
25. november 2003 - 16:22 #16
if ($part['dir'] != $tmpdir) echo $part['dir']."<br />";

skulle nok lige være:

if ($part['dir'] != $tmpdir) echo "<b>".$part['dir']."</b><br />";
Avatar billede 4us.dk Nybegynder
26. november 2003 - 10:54 #17
Det ser godt ud.

Er det ikke muligt at kunne lige inden den udskriver variablen, fjerne "HOME/" eller lign.? det er som sådan det eneste jeg kan se som er galt.

det kunne være totalt vildt, hvis det var muligt at kunne søge på "og" også... nu er det jo at man kan søge på "eller" ved at bruger "+", kan man så ikke lave eksempelvis "hej med dig" så den søger efter en sætning evt.
eller på en eller anden måde at den søger efter alle ordene.

ved ikke lige om det er til at forstå, heh.

Du skal have mange tak for hjælpen, jeg tror dette er det sidste ;)
- sætter dog lige points op i det mindste
Avatar billede 4us.dk Nybegynder
26. november 2003 - 11:09 #18
bestemte ord vil også være perfekt - mere fordi det vil måske se lidt vildt ud hvis man søger på sider med mange tekster, og man så søger på "er" eller "en" hehe.

Jeg kan simpelthen ikke finde andre rettelser end det, så vil det være perfekt og du skal have virkelig mange tak for din utrolige hjælp.
Avatar billede detox Nybegynder
26. november 2003 - 11:40 #19
Et godt råd er, når man skal lave et script, at gøre sig klart fra starten, hvilket resultat man ønsker. Så kan man nøjes med smårettelser til sidst. Det gør det nemmere at lave og giver et bedre resultat.
Jeg har ikke tid til at rette det helt til nu. Jeg har fjernet HOME og som det er nu kan du godt søge på 'hej med dig' eller lign.
Avatar billede detox Nybegynder
26. november 2003 - 11:40 #20
<?
if (isset($_POST['search']) && $_POST['search'] != "") {
    $search = $_POST['search'];
    echo "<p>Du har søgt på: <span  style='color: #CC3300;'>".stripslashes($search)."</span></p>";
    $search = ereg_replace("\+", "|", $search);
    $sti = ".";//Sti til mappe her
    $tilladt = array('htm', 'html');
    $forbudt = array('top.htm', 'top.html', 'bund.htm', 'bund.html');
    getDirList($sti);
    if (isset($filelist)) {
        foreach ($filelist as $file) {
            $fil = tjek($file, $search);
            if ($fil != "") $files[] = $fil;
        }
        if (isset($files)) {
            sort($files, SORT_STRING);
            $tmpdir = "";
            foreach ($files as $fil) {
                $part = short($fil);
                if ($part['dir'] != $tmpdir) echo "<b>".$part['dir']."</b><br />";
                echo "<a href='".$fil."'>".$part['name']."</a><br />";
                $tmpdir = $part['dir'];
            }
        }else{
            echo "Ingen filer fundet!";
        }
    }else{
        echo "Ingen filer af den rette type!";
    }
}else{
    header("Location: test3.php");
}

// Funktioner
function short($fil) {
    $parts = pathinfo($fil);
    $base = $parts["basename"];
    $part['dir'] = substr($parts["dirname"],1,strlen($parts["dirname"]));
    if ($part['dir'] == "") $part['dir'] = "/";
    $arr = explode(".", $base);
    array_pop($arr);
    $part['name'] = implode(".", $arr);
    return $part;
}

function tjek($fil, $find) {
    $str = file_get_contents($fil);
    $pat = "/{$find}/i";
    if (preg_match($pat, $str)) {
        return $fil;
    }
}

function getDirList ($dirName) {
    global $tilladt;
    global $forbudt;
    global $filelist;
    $d = dir($dirName);
    while($entry = $d->read()) {
        if ($entry != "." && $entry != "..") {
            if (is_dir($dirName."/".$entry)) {
                getDirList($dirName."/".$entry);
            } else {
                $path = pathinfo($entry);
                if (isset($path['extension']) && in_array($path['extension'], $tilladt)) {
                    if (!in_array($path['basename'], $forbudt)) {
                        $filelist[] = $dirName."/".$entry;
                    }
                }
            }
        }
    }
$d->close();
}
?>
Avatar billede 4us.dk Nybegynder
07. december 2003 - 15:27 #21
Mange tak, undskyld jeg ikke lige fik afsluttet det, heh ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester