|
|
 |

|

 |

| Community » CGI: Allgemeines Forum |
|
Suche and / or
|
Seitenanfang |
Ich versuche gerade ein Script zur Volltextsuche anzupassen aus einem Suchformular wird die Eingabe in einzelne Wörter zerlegt <code>@texts = split(/\s+/, $FORM{'text'});</code> zusätzlich soll es möglich sein, die Eingabe im Formularfeld mit und / oder differenzieren zu können. Der 'oder' Teil ist fertig und funktioniert. <code>if ($FORM{'boolean'} eq 'oder') { foreach $text (@texts) { if($line =~ /$text/i) ....weiter im script</code>Wie kann ich jetzt aber beim Boolschen 'und' erreichen, dass nur die Zeilen ausgegeben werden, in denen alle Strings $text des Arrays @texts vorkommen? <code>elsif ($FORM{'boolean'} eq 'und') { ??????????</code> Für einen Hinweis wäre ich dankbar.
Datum: 30.01.2005-23:47

|
re: Suche and / or
|
Seitenanfang |
| Du könntest mit eval() arbeiten und dir deinen regexp vorher zusammenbauen mit my $searcher = join(".*", @texts); my $execute = "if (\$line =~ /$searcher/i) { push \@found, \$line; }"; eval($execute); in @found müssten dann alle 'lines' sein. Paul
Datum: 03.02.2005-19:25

|
re: Suche and / or
|
Seitenanfang |
Danke erst mal Paul, ich habe das versucht in meinem Code, aber ich bekomme statt einer aufgrund der verschiedenen Suchbegriffe meines @texts-Arrays alle! Zeilen zurückgegeben???Ich hatte in der Zwischenzeit schon eine funktionierende (geht vermutlich einfacher?)Lösung ausgetüftelt. Hier mal der betroffene Teil-Code: # Loops through all urls for($n=0; $n<@ALLURLS; $n++) { $flag_page=0; # split between the URL and the page description @PARTS = split(/\|/, $ALLURLS[$n]); if (open(CONTENT_FILE,"$PARTS[0]")) { @CONTENT = <CONTENT_FILE>; close(CONTENT_FILE); for($m=0; $m<@CONTENT && $flag_page < 1000; $m++) { $line=$CONTENT[$m]; # Remove html tags from $line $line =~ s/<(.*?)>/\.\.\./g; if ($FORM{'boolean'} eq 'oder'){ foreach $text (@texts) { if($line =~ /$text/){ &result; } } } elsif ($FORM{'boolean'} eq 'und'){ # ############################## PAUL's CODE my $searcher = join(".*", @texts); my $execute = "if (\$line =~ /$searcher/i) { push \@found, \$line; }"; eval($execute); # ############################## Mein bisheriger Code, funktioniert, # geht aber vermutlich einfacher # if($line =~ /@texts[0]/) { # if ($line =~ /@texts[1]/) { # if ($line =~ /@texts[2]/) { # if ($line =~ /@texts[3]/) { # if ($line =~ /@texts[4]/) { &result; # } # } # } # } # } } } } else { &error_open; } } # Prints the rest of the page if ($flag_any == 0) { print "<div align=\"center\">"; print "<center>"; print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"4\" width=\"70%\">"; print "<tr>"; print "<td width=\"100%\"><font color=\"#000080\" face=\"Arial\" size=\"2\">Kein passender Eintrag gefunden.</font></td>"; print "<\/tr>"; print "<\/table>"; print "<\/center>"; print "<\/div>"; } for($n=$loopend; $n<$tempsize; $n++) { $line=@TEMPLATE[$n]; $line =~ s/##QUERY##/$query/gi; print $line; } exit; sub error_open { print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>Fehler!</title>\n"; print "</head>\n"; print "<body>\n"; print "<h1>"; print "Die Datei $filename konnte nicht geöffnet werden."; print "</h1><br>"; print "</body></html>"; exit; } sub result { $counter = $counter + 1; # Prints this record looping throug the template for($tpline=$loopstart; $tpline<$loopend && $flag_page == 0; $tpline++) { $linet=$TEMPLATE[$tpline]; $linet =~ s/##DESCRIPTION##/$PARTS[1]/gi; $linet =~ s/##URL##/$PARTS[0]/gi; print $linet; } print "<td width=\"50%\">"; print "<font face=\"Arial\" size=\"2\">"; print $line;print"<br>"; print "<\/font>"; print "<\/td>"; print "<\/tr>"; $flag_page = $flag_page+1; if ($flag_page == 2) {$counter--;} $flag_any = 1; }
Wieso liefert dein Code in dem Kontext alle!? Zeilen zurück? Gruß Georges
Datum: 04.02.2005-01:12

|
re: Suche and / or
|
Seitenanfang |
| hm, wahrscheinlich, weil der reguläre ausdruck ".*" auf alle! zeichen anschlägt. deswegen wäre ein "[\w\s]+" besser - geht das? Paul
Datum: 04.02.2005-09:58

|
re: Suche and / or
|
Seitenanfang |
| Danke für die promte Antwort, Ich hab's versucht, auch hierbei werden alle Datensätze (Zeilen) ausgegeben. Vielleicht muss ich selber auch noch mal in der Perl Dokumentation nachschlagen. Gruß Geo
Datum: 04.02.2005-11:05

|
re: Suche and / or
|
Seitenanfang |
| Nachtrag: Wenn ich das richtig lese erzeut ja dein term eine Verkettung der einzelnen Strings im Array. Diese sind das, was ich ganz am Anfang meines Scripts aus einem Formularfeld auslese. wenn ich es mit diesem Skalar my $seacher = $FORM{'text'}; versuche, erhalte ich die gleiche vollständige Ausgabe aller Zeilen Gruß Georges
Datum: 04.02.2005-11:12

|
re: Suche and / or
|
Seitenanfang |
| hm, tja ich würd sagen, poste mal $execute und den umgebenden code Paul
Datum: 04.02.2005-13:21

|
re: Suche and / or
|
Seitenanfang |
| ach, da fällt mir ein, dass ginge sowieso nicht so, wie ich es schrieb, weil dann die reihenfolge feststünde. am einfachsten ists wahrscheinlich doch mit einer rekursiven funktion, die aber allerdings relativ langseim sein würde.. Paul
Datum: 04.02.2005-13:28

|
|

|

|

|
 |

|

|
|