Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]762[/thread]

suche erst ab einem bestimmten bereich aktivieren

Leser: 1


<< |< 1 2 3 4 ... 6 >| >> 52 Einträge, 6 Seiten
Rocco
 2006-06-23 16:05
#8112 #8112
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
ich hab ein funktionierendes suchscript für eine homepage,
jetzt ist es leider so, dass zuviele ergebnisse ausgespuckt werden, weil link und bildernamen vielleicht schon den suchtext enthalten, im content aber nichts dergleichen drinnensteht.
dabei gibt es auf jeder htm seite ein einfaches merkmal ab wann die suche aktiv werden sollte.
und zwar beginnt jeder textbereich mit einem:
<div class="scroll"> kann mir da wer aus der klemme helfen und das untenstehende script so anpassen, dass erst ab diesem <div class="scroll"> text in den durchsuchten dateien,
ergebnisse angezeigt werden.

hier das momentane script:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sub search {

  @terms = split(/\s+/, $FORM{'terms'});

  foreach $FILE (@FILES) {

     open(FILE,"$FILE");
     @LINES = <FILE>;
     close(FILE);

     $string = join(' ',@LINES);
     $string =~ s/\n//g;
     
     
   
        foreach $term (@terms) {
           &Umlaute;

              if ($string =~ /$term/) {
        $include{$FILE} = 'yes';
                 last;
              }
              else {
                 $include{$FILE} = 'no';
              }

        }

   
  }
}  


danke für eure hilfe :-)
renee
 2006-06-23 18:12
#8113 #8113
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde das mit CPAN:HTML::Parser machen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl

use strict;
use warnings;
use HTML::Parser;

my $html_file = './test.html';
my @search = qw(Hallo Welt test);
my $string = "";

my $parser = HTML::Parser->new(
api_version => 3,
start_h => [\&start,"self,tagname,attr"],
text_h => [\&text,"self,dtext"],
end_h => [\&end,"self,tagname"]);

print "parse...";
$parser->parse_file($html_file);
print "done\n";
for my $word(@search){
if($string =~ /$word/){
print $word," gefunden\n";
}
}


sub start{
my ($self,$tag,$attr) = @_;
if($tag eq 'div' && $attr->{class} eq 'scroll'){
$self->{search} = 1;
}
}

sub text{
my ($self,$dtext) = @_;
$string .= $dtext if($self->{search});
}

sub end{
my ($self,$tag) = @_;
if($tag eq 'div'){
$self->{search} = 0;
}
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Rocco
 2006-06-23 19:08
#8114 #8114
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
hmm danke, ich möchte aber jetzt nicht das ganze script umbauen, weil es ja ganz gut funktioniert soweit und ich nicht über die erforderlichen kentnisse verfüge, um das umzusetzten.
deswegen bin ich mir auch nicht sicher, ob ich dein beispiel praktisch verwerten kann.
glaube aber eher nicht. :(
im prinzip will ich ja nur folgendes, ich schreibs mal in pseudocode in die funktion, sollte für einen der sich auskennt überhaupt kein problem darstellen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
sub search {

 @terms = split(/\s+/, $FORM{'terms'});

 foreach $FILE (@FILES) {

    open(FILE,"$FILE");
    @LINES = <FILE>;
    close(FILE);



    $string = join(' ',@LINES);
    $string =~ s/\n//g;
   
  //////// PSEUDOCODE
   foreach(@LINES != <div class="scroll">)
   {

   gehe zu nächster zeile in @LINES
  }

wenn der string gefunden wurde lauf weiter in der funktion,
an der position wo wir in @LINES gerade sind
  ///////// PSEUDOCODE ENDE

       foreach $term (@terms) {
          &Umlaute;

             if ($string =~ /$term/) {
                $include{$FILE} = 'yes';
                last;
             }
             else {
                $include{$FILE} = 'no';
             }

       }

   
 }
}


also das die suche erst beginnt, wenn der string gefunden wurde.
renee
 2006-06-23 19:44
#8115 #8115
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
In Deinen bestehenden Code integriert sieht es in etwas so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use HTML::Parser;

my $string = "";

sub search {
my @terms = split(/\s+/, $FORM{'terms'});

my $parser = HTML::Parser->new(
api_version => 3,
start_h => [\&start,"self,tagname,attr"],
text_h => [\&text,"self,dtext"],
end_h => [\&end,"self,tagname"]);
for my $html_file(@FILES){
$string = '';
$parser->parse_file($html_file);

foreach $term (@terms) {
&Umlaute;
if ($string =~ /$term/) {
$include{$FILE} = 'yes';
last;
}
else {
$include{$FILE} = 'no';
}
}
}
}

sub start{
my ($self,$tag,$attr) = @_;
if($tag eq 'div' && $attr->{class} eq 'scroll'){
$self->{search} = 1;
}
}

sub text{
my ($self,$dtext) = @_;
$string .= $dtext if($self->{search});
}

sub end{
my ($self,$tag) = @_;
if($tag eq 'div'){
$self->{search} = 0;
}
}


Deine Version etwas abgewandelt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sub search {
@terms = split(/\s+/, $FORM{'terms'});

foreach $FILE (@FILES) {
local $/;
open(FILE,"<",$FILE) or die $!;
my $string = <FILE>;
close(FILE);

($string) = $string =~ m~<div class="scroll">(.*?)</div>~;
$string =~ s/\n//g;

foreach $term (@terms) {
&Umlaute;

if ($string =~ /$term/) {
$include{$FILE} = 'yes';
last;
}
else {
$include{$FILE} = 'no';
}
}
}
}


Du solltest unbeding Wiki:use strict verwenden!

Und zu regulaeren Ausdruecken kannst Du Dir mal perlre, perlretut und perlrequick anschauen...\n\n

<!--EDIT|renee|1151077815-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Rocco
 2006-06-23 20:49
#8116 #8116
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
danke für deine mühe, leider bin ich nicht in der lage das entsprechend umzusetzten.
nach zahlreichen tests mit deinen vorschlägen ist es leider so, das nix mehr gefunden wird.
sprich die suche wird zwar durchlaufen, aber findet absolut nix mehr.

im kurzfassung kann man glaub ich sagen:
damit:
     open(FILE,"$FILE");
     @LINES = <FILE>;
     close(FILE);

     $string = join(' ',@LINES);

wird jede htm gefunden die das suchwort irgendwo behinhaltet
während so

   my $string = <FILE>;
   close(FILE);

   ($string) = $string =~ m~<div class="scroll"(.*?)</div>~;

momentan leider nix mehr gefunden wird.
im htm steht das entscheidende zB so drinnen:

<div class="scroll" style="background:#9ACAA4">

deswegen hab ich das > noch herausgelöscht bei deiner variante, hat aber leider nix genützt.
Dubu
 2006-06-24 00:05
#8117 #8117
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Bist du sicher, dass du das "local $/;" aus renees Code übernommen hast?
Dubu
 2006-06-24 00:10
#8118 #8118
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@renee: Das "($string) = $string =~ m~<div class="scroll">(.*?)</div>~;" geht schief, wenn in dem <div class="scroll"> noch ein weiteres <div> ist.
Wenn schon per Regex, dann würde ich eher dies vorschlagen:
Code: (dl )
$string =~ s~.*<div class="scroll".*?>~~i;   # loesche alles vor dem div


@Rocco: Nimm renees Variante mit HTML::Parser. Da wird wirklich nur der Text durchsucht und nicht die HTML-Tags.
Rocco
 2006-06-26 16:55
#8119 #8119
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
hätt ich gerne genommen, leider wird aber nix gefunden.

ich hab jetzt deinen vorschlag versucht und juhuu, wieder was gefunden, aber leider wieder zuviel.
hier der momentane code:

Code: (dl )
1
2
3
4
5
6
7
8
9
foreach $FILE (@FILES) {
local $/;

      open(FILE,"<",$FILE) or die $!;
      my $string = <FILE>;

     close(FILE);
   $string =~ s~.*<div class="scroll".*?>~~i;   # loesche alles vor dem div
     $string =~ s/\n//g;




hab dann folgendes versucht:

aus
Code: (dl )
$string =~ s~.*<div class="scroll".*?>~~i;   # loesche alles vor dem div

hab ich diese mischung versucht:
Code: (dl )
1
2
($string) = $string =~ s~.*<div class="scroll".*?>~~i;   # loesche alles vor dem div


woruafhin wieder gar nix gefunden wurde :-(((((
renee
 2006-06-26 17:12
#8120 #8120
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
kannst Du mal eine Beispiel-HTML-Datei posten??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Rocco
 2006-06-26 17:31
#8121 #8121
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
hier hab ich die testsuche eingerichtet: http://www.lottermoser.at/test/searchtest.htm
script variante ist wie gesagt grad die obige aktiv, wo zuviel gefunden wird.
wenn man zB pumpe eingibt werden alle seiten von gartenartikel gefunden wo pumpe ein menüpunkt ist.
und dieser text befindet sich in den html seiten immer vor dem <div class= "scroll".....
wenn man lottermoser eingibt passts zB. klarerweise, weil dieses wort in keinem tag vorkommt.
beim suchergebnis steht oft *.jpg, das ist nur der momentane titel der html die müssen noch umbenannt werden.
<< |< 1 2 3 4 ... 6 >| >> 52 Einträge, 6 Seiten



View all threads created 2006-06-23 16:05.