webForumDet fria alternativet

Sökning i lista

6 svar · 338 visningar · startad av pronet

pronetMedlem sedan dec. 200412 inlägg
#1

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!!

MatteMedlem sedan aug. 20002 975 inlägg
#2

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

$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:

$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:

$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);
pronetMedlem sedan dec. 200412 inlägg
#3

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!

MatteMedlem sedan aug. 20002 975 inlägg
#4

Om du inte kör i safe_mode på din server så kan du ställa om timeout-tiden med set_time_limit().

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

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å:

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']);
pronetMedlem sedan dec. 200412 inlägg
#5

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!

MatteMedlem sedan aug. 20002 975 inlägg
#6

Ä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

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 // <-- Ö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']);
 ?>
pronetMedlem sedan dec. 200412 inlägg
#7

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!

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)