Thread suchscript anpassen (8 answers)
Opened by Rocco at 2007-03-07 16:02

Rocco
 2007-03-07 16:02
#9706 #9706
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
Hallo,

renee hat mir vor ca. einem halben jahr entscheidend geholfen, ein modernes funktionierendes suchscript zu erstellen.

das script läuft herrvorragend und tut brav seinen dienst, jetzt möchte ich es allerdings auch für eine andere seite einsetzen, aber dafür muss ich das suchscript um einige speziellen funktionen reduzieren.

im prinzip möchte ich das script so umändern, dass jetzt alle seiten komplett durchsucht werden, vielleicht mit der möglichkeit gewisse html seiten von der suche auszuschliessen.


bei der anderen homepage waren alle contentbereiche in <div class = "scroll"> eingschlossen.
und bei der scriptvariante von renee werden nur diese bereiche durchsucht (und die titel).


mein versuch diese spezielle suche zu umgehen war jetzt einfach der:

diesen part
Code: (dl )
1
2
3
4
  my ($self,$tag,$attr) = @_;
 if($tag eq 'div' && $attr->{class} eq 'scroll'){
     $self->{search} = 1;
 }


damit zu ersetzen

Code: (dl )
1
2
3
4
  my ($self,$tag,$attr) = @_;
 if($tag eq 'body'){
     $self->{search} = 1;
 }


was aber leider wieder zu folgender fehlermeldung geführt hat.

Quote
Quantifier follows nothing in regex; marked by <-- HERE in m/? <-- HERE / at /home/netzgrafik/www.marktgemeinde-seibersdorf.at/scripts/search.pl line 139.


welches diese zeile ist
Code: (dl )
  $term=~ s/?/?\;/g; 



ORIGINALSCRIPT
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
use CGI;
use File::Find;
use HTML::Parser;

my $cgi     = CGI->new();
print $cgi->header(-type => 'text/html');
my %params  = $cgi->Vars();
my $string  = '';
my $title      = '';
my $basedir = '/home/netzgrafik/www.marktgemeinde-seibersdorf.at/';
my $base_url = 'http://www.marktgemeinde-seibersdorf.at/';
my $hp_title = 'Startseite';


# hier noch den Pfad zur Vorlage eintragen
my $template = '/home/netzgrafik/www.lottermoser.at/vorlage/vorlage.htm';

my @files = ();
find(\&find_files,$basedir);
my ($includes) = search($params{terms},\@files,$basedir);
print_html($base_url,$template,$hp_title,$params{terms},$includes);

sub find_files{
 push(@files,$File::Find::name) if(-f $File::Find::name && $_ =~ /\.htm$/);
}

sub print_html{
 my ($base,$template,$title,$terms,$hashref) = @_;

  my $content = '';
  {
      local $/;
      open(my $fh,'<',$template) or die $!;
      $content = <$fh>;
      close $fh;
  }

  my $html = '<ul>';
  for my $key(keys(%$hashref)){
      $html .= '<li><a href="'.$base.$key.'">'.$hashref->{$key}."</li>\n";
  }
  $html .= qq~</a></ul><hr align="left" width="100%" size="2" noshade color="#00007F">\n
           <font color="#00007F">Such Information:</font><p>
           <ul>\n<li><b><FONT COLOR=#00007F>Suchbegriff: </FONT></b>~;

 $html.= join(", ",split(/\s+/,$terms));

 $html .= qq~<li><a href="$base">$title</a>\n</ul>
                <hr align="left" width="100%" size="2" noshade color="#00007F">\n~;
               
                #<a href="http://www.netzgrafik.com">netzgrafik.com</a>.\n~;


  $content =~ s/\$Titel/$title/;
  $content =~ s/\$Message/$html/;

  print $content;
}

sub search{
 my ($termsstring,$files,$basedir) = @_;
 my @terms = split(/\s+/,$termsstring);

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

 $parser->{divs} = 0;

 my %include;
 for my $html_file(@$files){
     $string = '';
     $title = '';
     $parser->parse_file($html_file);

     foreach my $term (@terms) {
         $term = umlauts($term);

         # hier wurde noch das "i" angef?gt f?r "ignore case" also
         # matching ohne Ber?cksichtigung von Gro?- und Kleinschreibung

          if ($string =~ /$term/i or $title =~ /$term/i) {
            (my $local_file =  $html_file) =~ s/\Q$basedir\E//;
            $include{$local_file} = $title;
            last;
        }

         
     }
 }
 return \%include;
}

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

 }
}

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

sub end{
 my ($self,$tag) = @_;
 if($tag eq 'div' and $self->{search}){
     $self->{divs}--;
 }
 if($self->{divs} == 0){
     $self->{search} = 0;
 }
 if($tag eq 'title'){
     $self->{title} = 0;
 }
}  
 
sub umlauts{
 my ($term) = @_;
 $term=~ s/&”/?\;/g;
 $term=~ s/x
/?\;/g;
 $term=~ s/&–/?\;/g;
 $term=~ s/?/?\;/g;
 $term=~ s/&¸/?\;/g;
 $term=~ s/?/?\;/g;
 $term=~ s/?/?\;/g;
 return $term;
}

View full thread suchscript anpassen