---
title: "Sökning i lista"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/118314-sökning-i-lista"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "pronet"
published: "2004-12-19T01:54:22.000Z"
updated: "2004-12-19T15:35:01.000Z"
replies: 6
views: 344
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/118314-sökning-i-lista"
---

# Sökning i lista

## #1 — pronet, 2004-12-19T01:54Z

Hej! 

Jag har två listor; en med ord och en med domännamn. 

Hur kan jag på ett enkelt sätt få fram samtlifa domännamn som matchar något av orden i ordlistan? 

T.ex:

Ordlista.txt: 

ord1
ord2
ordd
oord

Domänlista.txt:

ord12.com
domain.com
ord1.com
ord.net
oordd.com
oord.com

RESULTAT:

ord1.com
oord.com

Kommer ingen vart, skulle bli överlycklig för lite hjälp! Det måste fungera för låånga listor också..

Tackar!!

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

## #2 — Matte, 2004-12-19T11:08Z

Du kan testa något på det här hållet:

```php
$search = file('Ordlista.txt');

for ($i=0; $i<count($search); $i++) {
   $search[$i] = preg_quote(trim($search[$i]));
   if (empty($search[$i])) {
      unset($search[$i]);
   }
}
$search = implode("|", $search);

$domains = file_get_contents('Domänlista.txt');

preg_match_all("/^($search)\.(com|net|org|nu|se)/im", $domains, $hits);

print_r($hits[0]);
```

 

Är filen väldigt stor kanske du istället får göra så här:

```php
$search = file('Ordlista.txt');

for ($i=0; $i<count($search); $i++) {
   $search[$i] = preg_quote(trim($search[$i]));
   if (empty($search[$i])) {
      unset($search[$i]);
   }
}
$search = implode("|", $search);

$hits = array();
$fp = fopen('Domänlista.txt', 'r');
while (!feof ($fp)) {
   $row = trim(fgets($fp, 4096));
   if (preg_match("/^($search)\.(com|net|org|nu|se)/im", $row)) {
      $hits[] = $row;
   }
}
fclose($fp);

print_r($hits);
```

 

Du får själv fylla på *(com\|net\|org\|nu\|se)* med ytterligare huvuddomäner.
Är du säker på att där inte finns några domäner typ *ord1.test.com* kan du helt stryka huvuddomänlistan från regexpet. I den andra varianten kan du då även stryka själva regexpet så att det blir:

```php
$search = file('Ordlista.txt');

for ($i=0; $i<count($search); $i++) {
   $search[$i] = strtolower(trim($search[$i]));
   if (empty($search[$i])) {
      unset($search[$i]);
   }
}

$hits = array();
$fp = fopen('Domänlista.txt', 'r');
while (!feof ($fp)) {
   $row = strtolower(trim(fgets($fp, 4096)));
   if (in_array(substr($row, 0, strpos($row, ".")), $search)) {
      $hits[] = $row;
   }
}
fclose($fp);

print_r($hits);
```

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

## #3 — pronet, 2004-12-19T13:05Z

wow! Inte illa vilken hjälp man får!!

Tackar tackar! Koden fungerade perfekt, dock inte på en lite större lista: "Maximum execution time of 30 seconds exceeded". 

Finns det kanske något sätt att få det att fungera på en gigantisk lista? 

Thanks!

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

## #4 — Matte, 2004-12-19T14:26Z

Om du inte kör i safe_mode på din server så kan du ställa om timeout-tiden med [set_time_limit](http://se2.php.net/manual/en/function.set-time-limit.php)().

Lägg då följande i början av skriptet:

```php
set_time_limit(0);
```

 

Om du kör i safe_mode, eller webbhotellet av någon anledning spärrat set_time_limit, så får du köra efter principen att läs in ett antal rader av filen, ladda sedan om sidan och ta med dig filpositionen till den sidan för att därifrån fortsätta.
Då måste du spara det du redan hittat på något sätt, t.ex. i en session. Testa då:

```php
session_start();

if (!isset($_GET['fpos'])) {
   $_SESSION['hits'] = array();
}

$search = file('Ordlista.txt');

for ($i=0; $i<count($search); $i++) {
   $search[$i] = strtolower(trim($search[$i]));
   if (empty($search[$i])) {
      unset($search[$i]);
   }
}

$fp = fopen('Domänlista.txt', 'r');

if (isset($_GET['fpos'])) {
   fseek($fp, $_GET['fpos']);
}

$nr = 0;
while (!feof ($fp)) {
   $row = strtolower(trim(fgets($fp, 4096)));
   if (in_array(substr($row, 0, strpos($row, ".")), $search)) {
      $_SESSION['hits'][] = $row;
   }
   $nr++;
   if ($nr == 100) {
      $ftell = ftell($fp);
      fclose($fp);
      header("Location: {$_SERVER['PHP_SELF']}?fpos=$ftell");
      exit;
   }
   
}
fclose($fp);

print_r($_SESSION['hits']);
```

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

## #5 — pronet, 2004-12-19T14:45Z

Tackar! 

Hehe, går inge vidare det här.. 

med varient 1 (set_time_limit) så blir det istället att..

"Fatal error: Allowed memory size of 8388608 bytes exhausted "

Och med variant två så..

Cannot send session cookie - headers already sent by (output started at /home/test/public_html/search.php:2) in /home/test/public_html/search.php on line 4

Börjar misstänka att det kanske inte går att göra detta utan att använda sig av databas eller liknande..

eller? =)

Tackar!

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

## #6 — Matte, 2004-12-19T15:10Z

Är det en väldigt stor fil så var det första att vänta på variant 1.

Det andra är ett header-fel, vilket innebär att du inte satt din header innan du skickade output till webbläsaren.

Men då verkar set_time_limit fungera, så då kan du testa så här:

```php
<?php

set_time_limit(0);

$search = file('Ordlista.txt');

for ($i=0; $i<count($search); $i++) {
   $search[$i] = strtolower(trim($search[$i]));
   if (empty($search[$i])) {
      unset($search[$i]);
   }
}

$hits = array();
$fp = fopen('Domänlista.txt', 'r');
while (!feof ($fp)) {
   $row = strtolower(trim(fgets($fp, 4096)));
   if (in_array(substr($row, 0, strpos($row, ".")), $search)) {
      $hits[] = $row;
   }
}
fclose($fp);

print_r($hits);

?>
```

Ska du köra sessionsvarianten så blir det så här:

```php
<?php // <-- Översta raden längst till vänster.

session_start();

if (!isset($_GET['fpos'])) {
   $_SESSION['hits'] = array();
}

$search = file('Ordlista.txt');

for ($i=0; $i<count($search); $i++) {
   $search[$i] = strtolower(trim($search[$i]));
   if (empty($search[$i])) {
      unset($search[$i]);
   }
}

$fp = fopen('Domänlista.txt', 'r');

if (isset($_GET['fpos'])) {
   fseek($fp, $_GET['fpos']);
}

$nr = 0;
while (!feof ($fp)) {
   $row = strtolower(trim(fgets($fp, 4096)));
   if (in_array(substr($row, 0, strpos($row, ".")), $search)) {
      $_SESSION['hits'][] = $row;
   }
   $nr++;
   if ($nr == 100) {
      $ftell = ftell($fp);
      fclose($fp);
      header("Location: {$_SERVER['PHP_SELF']}?fpos=$ftell");
      exit;
   }
   
}
fclose($fp);

print_r($_SESSION['hits']);
 ?>
```

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

## #7 — pronet, 2004-12-19T15:35Z

tack för det! 

ehe.. tror jag ger upp och leter lite mer efter något win32 program som kan göra det jag vill. 

Det är helt enkelt en för stor fil (60000+ ord). 

Tack ändå!! Bra kodning!

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

---

Tråden på webben: https://www.webforum.nu/amne/php/118314-sökning-i-lista
