Jump to content

limit search results to 75 characters?


isign4jc

Recommended Posts

I am working on a small search engine to put into my site to search the text on my pages. Right now all my page's text are being held in my database and displayed on my actual pages using php. Anyways, I have so far limited my search results to the first 75 characters, then given the user a link to the page that the keyword they searched for resides on. The problem is that some of the keyowrds occur after the 75th character. Is there a way to display 75 characters with the keyword being in the middle of those 75 characters?

 

Here's my code...it's pretty long... :

 

<?php

//This is a working script

//Make sure to go through it and edit database table filelds that you are seraching

//This script assumes you are searching 3 fields

 

require_once ('../mysql_connect.php'); // Connect to the db.

 

//specify how many results to display per page

$limit = 10;

 

// Get the search variable from URL

  $var = @$_GET['q'] ;

//trim whitespace from the stored variable

  $trimmed = trim($var); 

//separate key-phrases into keywords

  $trimmed_array = explode(" ",$trimmed);

 

// check for an empty string and display a message.

if ($trimmed == "") {

  $resultmsg =  "<p>Please enter a search...</p>" ;

  }

 

// check for a search parameter

if (!isset($var)){

  $resultmsg =  "<p>Please enter a search...</p>" ;

  }

// Build SQL Query for each keyword entered

foreach ($trimmed_array as $trimm){

     

// EDIT HERE and specify your table and field names for the SQL query

     $query = "SELECT DISTINCT page_id, heading, SUBSTRING(main_text,1,75) AS main_text  FROM content WHERE heading LIKE \"%$trimm%\"  OR main_text LIKE  \"%$trimm%\" ORDER BY heading DESC" ;

     // Execute the query to  get number of rows that contain search kewords

     $numresults=mysql_query ($query);

     $row_num_links_main =mysql_num_rows ($numresults);

 

     // next determine if 's' has been passed to script, if not use 0.

     // 's' is a variable that gets set as we navigate the search result pages.

     if (empty($s)) {

         $s=0;

     }

 

      // now let's get results.

      $query .= " LIMIT $s,$limit" ;

      $numresults = mysql_query ($query) or die ( "Couldn't execute query" );

      $row= mysql_fetch_array ($numresults);

 

      //store record id of every item that contains the keyword in the array we need to do this to avoid display of duplicate search result.

      do{

//EDIT HERE and specify your field name that is primary key

          $adid_array[] = $row[ 'page_id' ];

      }while( $row= mysql_fetch_array($numresults));

} //end foreach

 

if($row_num_links_main == 0 && $row_set_num == 0){

   $resultmsg = "<p>Search results for:" . $trimmed  ."</p><p>Sorry, your search returned zero results</p>" ;

}

   //delete duplicate record id's from the array. To do this we will use array_unique function

   $tmparr = array_unique($adid_array);

   $i=0;

   foreach ($tmparr as $v) {

       $newarr[$i] = $v;

       $i++;

   }

 

// now you can display the results returned. But first we will display the search form on the top of the page

?>

 

<form action="search.php" method="get" name="search">

  <div align="center">

      <input name="q" type="text" value=" <?php echo $q; ?> " size="15">

      <input name="search" type="submit" value="Search">

  </div>

</form>

 

<p><?php

// display what the person searched for.

if( isset ($resultmsg)){

  echo $resultmsg;

  exit();

}else{

  echo "Search results for: " . $var;

}

?>

</p>

 

 

<?php

foreach($newarr as $value){

 

// EDIT HERE and specify your table and field names for the SQL query

$query_value = "SELECT DISTINCT page_id, heading, SUBSTRING(main_text,1,75) AS main_text FROM content WHERE page_id = '$value'";

$num_value=mysql_query ($query_value);

$row_linkcat= mysql_fetch_array ($num_value);

$row_num_links= mysql_num_rows ($num_value);

 

//now let's make the keywods bold. To do that we will use preg_replace function.

//EDIT parts of the lines below that have fields names like $row_linkcat[ 'field1' ]

//This script assumes you are searching only 3 fields. If you are searching more fileds make sure that add appropriate line.

  $titlehigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'heading' ] );

$linkhigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'main_text' ] );

 

 

foreach($trimmed_array as $trimm){

    if($trimm != 'b' ){

//IF you added more fields to search make sure to add them below as well.

        $titlehigh = preg_replace( "'($trimm)'si" ,  "<b>\\1</b>" , $titlehigh);

$linkhigh = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $linkhigh);

 

     }

//end highlight

 

 

switch ($value) {

 

case '1':

     echo '<a href="index.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '2':

     echo '<a href="aboutus.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '3':

     echo '<a href="contact.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '4':

     echo '<a href="resources.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '5':

     echo '<a href="services.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

}

 

 

?>

<p>

<?php echo $linkhigh; ?>...

 

</p>

<hr>

 

<?php

}   //end foreach $trimmed_array

   if($row_num_links_main > $limit){

   // next we need to do the links to other search result pages

      if ($s>=1) { // do not display previous link if 's' is '0'

        $prevs=($s-$limit);

         echo "<div align='left'><a href='$PHP_SELF?s=$prevs&q=$var&catid=$catid'>Previous " .$limit. "</a></div>";

      }

     // check to see if last page

     $slimit =$s+$limit;

       if (!($slimit >= $row_num_links_main) && $row_num_links_main!=1) {

     // not last page so display next link

          $n=$s+$limit;

           echo "<div align='right'><a href='$PHP_SELF?s=$n&q=$var&catid=$catid'>Next " .$limit. "</a></div>";

        }

    }

}  //end foreach $newarr

?>

 

Link to comment
Share on other sites

Ok, you mean this i think:

 

If the keyword is "cat"

and the link title is "one time long long long ago i found something on the road and it looked like a cat, i then ate it and ran"

you want it to show up like this "...and it looked like a cat, i then ate it..."

 

Is that what your talking about? If so,

 

use strpos().

 

like

 

<?php
$word = "cat";
$string = "one time long long long ago i found something on the road and it looked like a cat, i then ate it and ran";

$total_chars = 30; // you can change.. its the total number of allowed characters

// find where the word is
$word_loc = strpos($string,$word);

// put the word in the middle of the outputted string
if ($word_loc > ($total_chars / 2)) // if the word is past the middle of the string
{
  strtr($string,($total_chars/2),$total_chars); // cut off the string at beginning and end
  
  // put ellipses at the beginning and end 
  $string = "...".$string."...";
}
else // otherwise
{
  strtr($string,0,$total_chars); // just cut off the ending
  // put ellipses just at the end 
  $string .= "...";
}

// oh yeah... 
?>

 

i think that would work

Link to comment
Share on other sites

Yes, that is what i am trying to accomplish. I implemented your script into mine, but it only brings back the title and not the text from the page. The place where the ext usually appears is blank on the results page.

 

I must have somehow customized your script incorrectly. Here it is including your tidbit towards the end:

 

<?php

//This is a working script

//Make sure to go through it and edit database table filelds that you are seraching

//This script assumes you are searching 3 fields

 

require_once ('../mysql_connect.php'); // Connect to the db.

 

//specify how many results to display per page

$limit = 10;

 

// Get the search variable from URL

  $var = @$_GET['q'] ;

//trim whitespace from the stored variable

  $trimmed = trim($var); 

//separate key-phrases into keywords

  $trimmed_array = explode(" ",$trimmed);

 

// check for an empty string and display a message.

if ($trimmed == "") {

  $resultmsg =  "<p>Please enter a search...</p>" ;

  }

 

// check for a search parameter

if (!isset($var)){

  $resultmsg =  "<p>Please enter a search...</p>" ;

  }

// Build SQL Query for each keyword entered

foreach ($trimmed_array as $trimm){

     

// EDIT HERE and specify your table and field names for the SQL query

    $query = "SELECT DISTINCT page_id, heading, main_text  FROM content WHERE heading LIKE \"%$trimm%\"  OR main_text LIKE  \"%$trimm%\" ORDER BY heading DESC" ;

    // Execute the query to  get number of rows that contain search kewords

    $numresults=mysql_query ($query);

    $row_num_links_main =mysql_num_rows ($numresults);

 

    // next determine if 's' has been passed to script, if not use 0.

    // 's' is a variable that gets set as we navigate the search result pages.

    if (empty($s)) {

        $s=0;

    }

 

      // now let's get results.

      $query .= " LIMIT $s,$limit" ;

      $numresults = mysql_query ($query) or die ( "Couldn't execute query" );

      $row= mysql_fetch_array ($numresults);

 

      //store record id of every item that contains the keyword in the array we need to do this to avoid display of duplicate search result.

      do{

//EDIT HERE and specify your field name that is primary key

          $adid_array[] = $row[ 'page_id' ];

      }while( $row= mysql_fetch_array($numresults));

} //end foreach

 

if($row_num_links_main == 0 && $row_set_num == 0){

  $resultmsg = "<p>Search results for:" . $trimmed  ."</p><p>Sorry, your search returned zero results</p>" ;

}

  //delete duplicate record id's from the array. To do this we will use array_unique function

  $tmparr = array_unique($adid_array);

  $i=0;

  foreach ($tmparr as $v) {

      $newarr[$i] = $v;

      $i++;

  }

 

// now you can display the results returned. But first we will display the search form on the top of the page

?>

 

<form action="search.php" method="get" name="search">

  <div align="center">

      <input name="q" type="text" value=" <?php echo $q; ?> " size="15">

      <input name="search" type="submit" value="Search">

  </div>

</form>

 

<p><?php

// display what the person searched for.

if( isset ($resultmsg)){

  echo $resultmsg;

  exit();

}else{

  echo "Search results for: " . $var;

}

?>

</p>

 

 

<?php

foreach($newarr as $value){

 

// EDIT HERE and specify your table and field names for the SQL query

$query_value = "SELECT DISTINCT page_id, heading, main_text FROM content WHERE page_id = '$value'";

$num_value=mysql_query ($query_value);

$row_linkcat= mysql_fetch_array ($num_value);

$row_num_links= mysql_num_rows ($num_value);

 

//now let's make the keywods bold. To do that we will use preg_replace function.

//EDIT parts of the lines below that have fields names like $row_linkcat[ 'field1' ]

//This script assumes you are searching only 3 fields. If you are searching more fileds make sure that add appropriate line.

  $titlehigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'heading' ] );

$linkhigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'main_text' ] );

 

 

foreach($trimmed_array as $trimm){

    if($trimm != 'b' ){

//IF you added more fields to search make sure to add them below as well.

        $titlehigh = preg_replace( "'($trimm)'si" ,  "<b>\\1</b>" , $titlehigh);

$linkhigh = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $linkhigh);

 

    }

//end highlight

 

 

switch ($value) {

 

case '1':

    echo '<a href="index.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '2':

    echo '<a href="aboutus.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '3':

    echo '<a href="contact.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '4':

    echo '<a href="resources.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

 

case '5':

    echo '<a href="services.html"target="_blank"><h4>' . $titlehigh . '</h4></a>';

    break;

}

 

 

?>

<p>

<?php

 

$total_chars = 30; // you can change.. its the total number of allowed characters

 

// find where the word is

$word_loc = strpos($linkhigh,$trimm);

 

// put the word in the middle of the outputted string

if ($word_loc > ($total_chars / 2)) // if the word is past the middle of the string

{

  strtr($linkhigh,($total_chars/2),$total_chars); // cut off the string at beginning and end

 

  // put ellipses at the beginning and end

  $linkhigh = "...".$linkhigh."...";

}

else // otherwise

{

  strtr($linkhigh,0,$total_chars); // just cut off the ending

  // put ellipses just at the end

  $linkhigh .= "...";

}

 

// put ellipses at the beginning and end

$linkhigh = "...".$linkhigh."...";

?>

</p>

<hr>

 

<?php

}  //end foreach $trimmed_array

  if($row_num_links_main > $limit){

  // next we need to do the links to other search result pages

      if ($s>=1) { // do not display previous link if 's' is '0'

        $prevs=($s-$limit);

        echo "<div align='left'><a href='$PHP_SELF?s=$prevs&q=$var&catid=$catid'>Previous " .$limit. "</a></div>";

      }

    // check to see if last page

    $slimit =$s+$limit;

      if (!($slimit >= $row_num_links_main) && $row_num_links_main!=1) {

    // not last page so display next link

          $n=$s+$limit;

          echo "<div align='right'><a href='$PHP_SELF?s=$n&q=$var&catid=$catid'>Next " .$limit. "</a></div>";

        }

    }

}  //end foreach $newarr

?>

 

 

 

Link to comment
Share on other sites

I think that's what I already did, but I could be wrong. I just noticed, however, that my text results need to be echoed somehow. That is probably the reason that it did not display before.

 

This line gets my page's heading and main text from the database:

 

    $query = "SELECT DISTINCT page_id, heading, main_text  FROM content WHERE heading LIKE \"%$trimm%\"  OR main_text LIKE  \"%$trimm%\" ORDER BY heading DESC" ;

 

then, later, the heading is set as $titlehigh and the main text is set as $linkhigh and $trimm seems to be what the person searched for

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.