Schrift
[thread]898[/thread]

suchscript anpassen



<< >> 9 Einträge, 1 Seite
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;
}
renee
 2007-03-07 16:26
#9707 #9707
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
? ist ein Sonderzeichen bei Regulären Ausdrücken. Deswegen musst Du es escapen:
Code: (dl )
$term=~ s/\?/?\;/g;
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
 2007-03-07 16:57
#9708 #9708
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
[quote=renee,07.03.2007, 15:26]? ist ein Sonderzeichen bei Regulären Ausdrücken. Deswegen musst Du es escapen:
Code: (dl )
$term=~ s/\?/?\;/g;
[/quote]
hallo renee, danke für deine hilfe,
nachdem ich die zeile ausgebessert hatte und die 2 zeilen darunter wo es genauso war,
sind die fehlermeldungen weg und es wird mehr gefunden wie vorher.
leider noch nicht alles, es gibt seiten die noch immer von der suche nicht erfasst werden,

ich nehme an es hat was mit den seiten namen zu tun.
Code: (dl )
1
2
3
sub find_files{
 push(@files,$File::Find::name) if(-f $File::Find::name && $_ =~ /\.htm$/);
}


momentan werden nur htm dateien gefunden, aber keine *.html dateien kann das sein?

was mir auch noch aufegfallen ist sind die parts die divs betreffen hier drinnen

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
sub start{
my ($self,$tag,$attr) = @_;
if($tag eq 'div' && $attr->{class} eq 'scroll'){
    $self->{search} = 1;
}
if($tag eq 'div' and $self->{search}){    # DIESEN PART LÖSCHEN ?
    $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){         # DIESEN PART LÖSCHEN ?
    $self->{search} = 0;
}
if($tag eq 'title'){
    $self->{title} = 0;
}
}


kann das auch noch auswirkungen aufs suchergebnis haben, oder spielt das keine rolle mehr?
renee
 2007-03-07 18:06
#9709 #9709
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Um auch .html-Dateien zu finden:
Code: (dl )
 push(@files,$File::Find::name) if(-f $File::Find::name && $_ =~ /\.html?$/);


Ob das andere Auswirkungen hat, kann ich erst sagen, wenn ich den HTML-Code einer Seite sehe...
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
 2007-03-07 18:28
#9710 #9710
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
vielen dank, die suche funktioniert jetzt auf allen seiten :)
hast du vielleicht noch einen tipp, was ich machen kann, damit ich gewisse seiten von der suche ausschliessen kann?
renee
 2007-03-07 19:39
#9711 #9711
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
# dateien die nicht durchsucht werden sollen
my @unwanted = qw(test.html index.html);

my @files = ();
find(\&find_files,$basedir);
@files = grep{ my $i = $_; !grep{ $_ eq $i }@unwanted }@files;
my ($includes) = search($params{terms},\@files,$basedir);
print_html($base_url,$template,$hp_title,$params{terms},$includes);
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
 2007-03-07 20:07
#9712 #9712
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
danke nochmal, das ausschliessen funktioniert aber leider nicht, die seiten in @unwanted werden trotzden angeführt, liegts vielleicht am pfad (wohl eher nicht)
renee
 2007-03-08 09:44
#9713 #9713
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, mach aus
Code: (dl )
@files = grep{ my $i = $_; !grep{ $_ eq $i }@unwanted }@files;


einfach
Code: (dl )
@files = grep{ my $i = $_; !grep{ $i =~ /\Q$_\E$/ }@unwanted }@files;


(ungetestet)
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
 2007-03-08 12:38
#9714 #9714
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
super vielen dank, funktioniert astrein :laugh:
<< >> 9 Einträge, 1 Seite



View all threads created 2007-03-07 16:02.