perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 04:10

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  CGI: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragSuche 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

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

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

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

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

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

Beitragre: Suche and / or
Seitenanfang
hm, tja ich würd sagen, poste mal $execute und den umgebenden code

Paul

Datum: 04.02.2005-13:21

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

-






-
-