---
title: "Sökmotor!!?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/130776-sökmotor"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Guldstrand"
published: "2005-06-30T04:22:06.000Z"
updated: "2005-07-04T21:07:04.000Z"
replies: 13
views: 645
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/130776-sökmotor"
---

# Sökmotor!!?

## #1 — Guldstrand, 2005-06-30T04:22Z

Jag undrar ifall det är möjligt att skapa en sökmotor som söker efter filer i en speciell mapp på en server!? (Lite svårt att förklara.)

Mappen innehåller över 130.000 filer, och jag skulle vilja skapa en sökmotor på en hemsida som söker efter en speciell fil genom att skriva in hela eller delar av filnamnet etc.

Är tacksam ifall någon kan tipsa om ett färdigt script som fungerar enligt ovan.  :r

Permalänk: https://www.webforum.nu/p/130776

## #2 — pettsson, 2005-06-30T06:57Z

En kombination av [scandir()](http://se.php.net/manual/en/function.scandir.php) och [in_array](http://se.php.net/manual/en/function.in-array.php) borde kunna åstadkomma det. Prestanda vet jag dock inget om med en sådan stor array.

Permalänk: https://www.webforum.nu/p/1638381

## #3 — Guldstrand, 2005-06-30T17:01Z

> **pettsson skrev:**
>
> En kombination av [scandir()](http://se.php.net/manual/en/function.scandir.php) och [in_array](http://se.php.net/manual/en/function.in-array.php) borde kunna åstadkomma det. Prestanda vet jag dock inget om med en sådan stor array.

Eh..?  Hur menar du då? :r 

Hade uppskattat lite exempelkod.

Permalänk: https://www.webforum.nu/p/1638559

## #4 — Guldstrand, 2005-07-04T09:16Z

Behöver fortfarande hjälp med detta script.  :r

Permalänk: https://www.webforum.nu/p/1639509

## #5 — pimme, 2005-07-04T10:41Z

Nåt sånt här:

```php
$word = "ordDuVillSökaPå";
$dir = scandir("Mappen/du/vill/leta/i");
for($i = 0; $i < count($dir); ++$i)
    if(strstr($dir[$i], $word))  //Kör stristr() om du vill ignorera om det är en versal/gemen
        echo $dir[$i];
```

Om du inte skulle ha PHP5 så kan du använda

```php
function scandir($path, $sort_order = 0)
{
  $ret = array();
  $dir = dir($path);
  while($ret[] = $dir->read()) ;
  $dir->close();
  $sort_order ? rsort($ret) : sort($ret);
  return $ret;
}
```

Permalänk: https://www.webforum.nu/p/1639522

## #6 — Guldstrand, 2005-07-04T11:16Z

> **pimme skrev:**
>
> Nåt sånt här:
>
>
> ```php
> $word = "ordDuVillSökaPå";
> $dir = scandir("Mappen/du/vill/leta/i");
> for($i = 0; $i < count($dir); ++$i)
>     if(strstr($dir[$i], $word))  //Kör stristr() om du vill ignorera om det är en versal/gemen
>         echo $dir[$i];
> ```
>
> 
> 
> Om du inte skulle ha PHP5 så kan du använda
>
>
> ```php
> function scandir($path, $sort_order = 0)
> {
>   $ret = array();
>   $dir = dir($path);
>   while($ret[] = $dir->read()) ;
>   $dir->close();
>   $sort_order ? rsort($ret) : sort($ret);
>   return $ret;
> }
> ```

Tack för hjälpen, men jag förstår fortfarande inte hur jag ska lösa detta.  :r

Hade uppskattat ifall Du kunde sätta ihop koden till ett komplett script, som jag sedan kan modifera själv m.m.

Permalänk: https://www.webforum.nu/p/1639526

## #7 — Tinwëlint, 2005-07-04T14:26Z

Roligt att iterera genom 130 000 filer. Är inte filerna sorterade på något sätt i filsystemet. En binär sökning vore kanske möjlig.

Permalänk: https://www.webforum.nu/p/1639551

## #8 — pimme, 2005-07-04T15:01Z

Nej, filerna är inte sorterade i filsystemet, inte efter filnamn iaf.

Permalänk: https://www.webforum.nu/p/1639563

## #9 — pimme, 2005-07-04T15:03Z

I det här fallet kan man ta bort raden 

```php
$sort_order ? rsort($ret) : sort($ret);
```

Men jag la till den eftersom jag ville efterlikna hur scandir() i PHP5 fungerar.

Permalänk: https://www.webforum.nu/p/1639565

## #10 — Tinwëlint, 2005-07-04T17:18Z

Tänkte att när filerna var sorterade skulle det ju gå att använda en binär sökning. Men det gäller ju bara om man vill söka på början av filnamnen.

Guldstrand:
Här kommer ett exempel med en vanlig html-form:

```php
<?php

function scandir4($path, $sort_order = 0)
{
  $ret = array();
  $dir = dir($path);
  while($ret[] = $dir->read());

  $dir->close();
  $sort_order ? rsort($ret) : sort($ret);
  return $ret;

}

function search($term,$directory,$case_sensitive=true)
{
	$hits = array();
	if ($case_sensitive=true): $instr ="strstr"; else: $instr="stristr"; endif;
	
	$dir = scandir4($directory);
	
	for($i = 0; $i < count($dir); ++$i)
	{
	    if($instr($dir[$i], $term))
	    $hits[] = $dir[$i];
	}
	return $hits;
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="sv" xml:lang="sv">
<head>
<title>Katalogsökning</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

<form action="<?php echo $PHP_SELF; ?>" method="post">
	<label for="term">Sökord</label>
	<input id="term" name="term" type="text" />
	<label for="dir">Katalog</label>
	<input id="dir" name="directory" type="text" />
	<label for="case">Skiftlägeskänslig</label>
	<input id="case" name="case_sensitive" type="checkbox" value="on" />
	<button type="submit" name="submit" value="set">Sök</button>
</form>
<?php
echo $_POST['directory'];
if (isset($_POST['submit']) && isset($_POST['term']) && isset($_POST['directory']))
{
	if($_POST['case_sensitive'] != "on"): $cs = false; else: $cs=true; endif;

	$hits = search($_POST['term'],$_POST['directory'], false);

	if (!empty($hits))
	{
		echo "<ul>";
		foreach($hits as $i)
		{
			echo "<li>".$i."</li>";	
		}
		echo "</ul>";
	}
	else
	{
	echo "<p>Inga träffar</p>";
	}
}
elseif (isset($_POST['submit']))
{
	echo "<p>Både katalog och sökord behövs.</p>";
}

?>

</body>
</html>
```

 

Katalognamnet man skriver in blir relativt skriptets plats.

Permalänk: https://www.webforum.nu/p/1639591

## #11 — pimme, 2005-07-04T18:40Z

> **Tinwëlint skrev:**
>
> Tänkte att när filerna var sorterade skulle det ju gå att använda en binär sökning. Men det gäller ju bara om man vill söka på början av filnamnen.

Jo, men om man vill söka på andra delar av filnamnet så funkar det ju inte.
Dock, den största prestandaförlusten man gör är att det tar mer kraft att sortera och sen binärsöka, än att göra en loop som går igenom arrayen element för element. 
Och, eftersom du i din search() inte använder dig av att arrayen är sorterad, så är det mycket onödigt att köra \[r\]sort(). :)

Permalänk: https://www.webforum.nu/p/1639612

## #12 — Guldstrand, 2005-07-04T19:02Z

> **Tinwëlint skrev:**
>
> Tänkte att när filerna var sorterade skulle det ju gå att använda en binär sökning. Men det gäller ju bara om man vill söka på början av filnamnen.
> 
> Guldstrand:
> Här kommer ett exempel med en vanlig html-form:
> 
>
>
> ```php
> <?php
> 
> function scandir4($path, $sort_order = 0)
> {
>   $ret = array();
>   $dir = dir($path);
>   while($ret[] = $dir->read());
> 
>   $dir->close();
>   $sort_order ? rsort($ret) : sort($ret);
>   return $ret;
> 
> }
> 
> function search($term,$directory,$case_sensitive=true)
> {
> 	$hits = array();
> 	if ($case_sensitive=true): $instr ="strstr"; else: $instr="stristr"; endif;
> 	
> 	$dir = scandir4($directory);
> 	
> 	for($i = 0; $i < count($dir); ++$i)
> 	{
> 	    if($instr($dir[$i], $term))
> 	    $hits[] = $dir[$i];
> 	}
> 	return $hits;
> }
> 
> 
> ?>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> <html xmlns="http://www.w3.org/1999/xhtml" lang="sv" xml:lang="sv">
> <head>
> <title>Katalogsökning</title>
> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
> </head>
> <body>
> 
> <form action="<?php echo $PHP_SELF; ?>" method="post">
> 	<label for="term">Sökord</label>
> 	<input id="term" name="term" type="text" />
> 	<label for="dir">Katalog</label>
> 	<input id="dir" name="directory" type="text" />
> 	<label for="case">Skiftlägeskänslig</label>
> 	<input id="case" name="case_sensitive" type="checkbox" value="on" />
> 	<button type="submit" name="submit" value="set">Sök</button>
> </form>
> <?php
> echo $_POST['directory'];
> if (isset($_POST['submit']) && isset($_POST['term']) && isset($_POST['directory']))
> {
> 	if($_POST['case_sensitive'] != "on"): $cs = false; else: $cs=true; endif;
> 
> 	$hits = search($_POST['term'],$_POST['directory'], false);
> 
> 	if (!empty($hits))
> 	{
> 		echo "<ul>";
> 		foreach($hits as $i)
> 		{
> 			echo "<li>".$i."</li>";	
> 		}
> 		echo "</ul>";
> 	}
> 	else
> 	{
> 	echo "<p>Inga träffar</p>";
> 	}
> }
> elseif (isset($_POST['submit']))
> {
> 	echo "<p>Både katalog och sökord behövs.</p>";
> }
> 
> ?>
> 
> </body>
> </html>
> ```
>
>  
> 
> Katalognamnet man skriver in blir relativt skriptets plats.

Tack så hemskt mycket för koden, men den verkar inte fungera. :r

1\. Scriptet ska hämta information + fil från en annan dator
(Vill att scriptet (via internet) ska söka igenom en speciell mapp på min kompis dator.)
2\. Man ska kunna ladda ner filen

Svårt att förklara.

Permalänk: https://www.webforum.nu/p/1639617

## #13 — Tinwëlint, 2005-07-04T19:40Z

För att koppla upp till en annan server krävs en massa andra funktioner som inte jag har någon vidare koll på (kanske [fsockopen()](http://se.php.net/manual/en/function.fsockopen.php) är en bit på väg) Någon annan kanske vet hur man gör.

Att kunna ladda ner filen är inget problem egentligen. Bara att länka till den med hjälp av sökvägen till katalogen och filnamnet (när man väl har fått det att fungera).
Ungefär att ändra den här biten:

```php
    if (!empty($hits))
    {
        echo "<ul>";
        foreach($hits as $i)
        {
            echo "<li>".$i."</li>";    
        }
        echo "</ul>";
    }
```

såhär:

```php
    if (!empty($hits))
    {
        echo "<ul>";
        foreach($hits as $i)
        {
            echo "<li><a href=\".$_POST['directory'].$i."\">".$i."</li>";    
        }
        echo "</ul>";
    }
```

Pimme, det har du rätt i. Följde bara ditt första exempel 
 :) 

P.S.

scandir4() bör nog ändras som Pimme säger till:

```php
function scandir4($path)
{
  $ret = array();
  $dir = dir($path);
  while($ret[] = $dir->read());
  $dir->close();
  return $ret;
}
```

r1: länk till fsockopen()
r2: P.S.

Permalänk: https://www.webforum.nu/p/1639626

## #14 — Guldstrand, 2005-07-04T21:07Z

Nu förstår jag verkligen ingenting...  :r

Men jag uppskattar all hjälp jag kan få.

Permalänk: https://www.webforum.nu/p/1639646

---

Tråden på webben: https://www.webforum.nu/amne/php/130776-sökmotor
