www.webdeveloper.com
Results 1 to 2 of 2

Thread: Search Engine using Perl / CGI --- help

  1. #1
    Join Date
    Feb 2005
    Location
    Frisco, Texas
    Posts
    18

    Search Engine using Perl / CGI --- help

    I am very new to Perl but my job requires a simple search engine for our intranet site on an Apache server. I found a script from O'Reilly CGI Programming w/ Perl book. After some modifcations (with help) it runs with out errors. I can enter a keyword and it will run a search and display results. PROBLEM #1 The problem is this...unless the file is in the top level directory then it wont find it. I need to get it to search all the subdirectories and the folders within them. PROBLEM #2 When the search displays the results page the hyperlinks dont work. An example of <a href> created is http://company.com/cgi-bin/VIRTUAL_PATH/pagename.html. My guess with be the VIRTUAL_PATH is causing the problem but I have no real idea.

    Any help is appreciated...many thanks.

    here is the html file:

    <HTML>
    <HEAD>
    <TITLE>Simple 'Mindless' Search</TITLE>
    </HEAD>
    <BODY>
    <H1>Are you ready to search?</H1>
    <P>
    <FORM ACTION="/cgi-bin/grep_search2.cgi" METHOD="GET">
    <INPUT TYPE="test" NAME="query" SIZE="20">
    <INPUT TYPE="submit" VALUE="GO!">
    </FORM>
    </BODY>
    </HTML>


    here is the perl script:


    #!/usr/local/bin/perl -w

    use strict;
    use CGI;
    #use CGIBook::Error;
    use CGI::Carp 'fatalsToBrowser';

    my $DOCUMENT_ROOT = $ENV{DOCUMENT_ROOT};
    my $VIRTUAL_PATH = "";
    my $q = new CGI;
    my $query = $q->param( "query" );

    #if ( defined $query and length $query ) {
    # die "Please specify a valid query!";
    #}

    $query = quotemeta ( $query );
    my $results = search ( $q, $query );

    print $q->header( "text/html" ),
    $q->start_html( "Simple Perl Search" ),
    $q->h1( "Search for: $query" ),
    $q->ul ( $results || "No matches found" ),
    $q->end_html;

    sub search {
    my ( $q, $query ) = @_;
    my ( %matches, @files, @sorted_paths, $results );

    local( *DIR, *FILE );

    opendir DIR, $DOCUMENT_ROOT or
    error ( $q, "Cannot access search dir!" );

    @files = grep { -T "$DOCUMENT_ROOT/$_" } readdir DIR;
    closedir DIR;

    my $file;
    foreach my $file ( @files ) {
    my $full_path = "$DOCUMENT_ROOT/$file";
    open FILE, $full_path or
    error ( $q, "Cannot process $file!" );

    while ( <FILE> ) {
    if (/$query/io ) {
    $_ = html_escape( $_ );
    s| ($query) |<B>$1</B>|gio;
    push @{ $matches{$full_path}{content} }, $_;
    $matches{$full_path}{file} = $file;
    $matches{$full_path}{num_matches}++;
    }
    }
    close FILE;
    }

    @sorted_paths = sort {
    $matches{$b}{num_matches} <=>
    $matches{$a}{num_matches} ||
    $a cmp $b
    } keys %matches;

    my $full_path;
    foreach my $full_path ( @sorted_paths ) {
    my $file = $matches{$full_path}{file};
    my $num_matches = $matches{$full_path}{num_matches};
    my $link = $q->a( { -href => "VIRTUAL_PATH/$file" }, $file );
    my $content = join $q->br, @{ $matches{$full_path}{content} };

    $results .= $q->p( $q->b( $link ) . " ($num_matches matches)" .
    $q->br . $content
    );
    }

    return $results;

    }



    sub html_escape {
    my ( $text ) = @_;

    $text =~ s/&/&amp;/g;
    $text =~ s/</&lt;/g;
    $text =~ s/>/&gt;/g;
    return $text;

    }

  2. #2
    Join Date
    Mar 2004
    Posts
    282
    Try the Simple Search on this site - http://nms-cgi.sourceforge.net/scripts.shtml - from London PM

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles