-2

i'm trying to perform a php search with this code:

$search = &q;
$lines = file('file.txt');
// Store true when the text is found
$found = false;
foreach($lines as $line)
{
  if(strpos($line, $search) !== false)
  {
    $found = true;
    echo $line;
  }
}
// If the text was not found, show a message
if(!$found)
{
  echo '';

It searches every character and returns sometimes without a result. I want to style this code to search only letters and numbers but without any special characters included dots and commas. How can i do it? Thank you.

1 Answers1

1

Basic:

// $search contains query
// remove non-alphanumeric characters from search query
$search = preg_replace('[^a-zA-Z\d\s:]','',$search); 

// Get unfiltered file into an array
$original_lines = file('file.txt');

$num_matches = 0;
foreach ($original_lines as $line) {

      if(strpos(preg_replace('[^a-zA-Z\d\s:]','',$line), $search) !== false){
         $num_matches++;
         echo $line;
      }
}

if (!$num_matches){
   echo "No matches.";
}

Experimental, and probably memory and processing inefficient:

// $search contains query
// remove non-alphanumeric characters from search query
$search = preg_replace('[^a-zA-Z\d\s:]','',$search); 

// Get unfiltered file into an array
$original_lines = file('file.txt');

// Read entire file to string, filtering non-alphanumeric characters
$filtered_lines = preg_replace('[^a-zA-Z\d\s:]','',implode("\n",$original_lines); 

// Count the matches
if ($num_matches = preg_match_all($search,$filtered_lines,$matches)){

   // Convert back to array with replacements
   $filtered_lines = explode('\n',$filtered_lines); 

   $found_lines = 0; $line_index = -1;
   foreach ($filtered_lines as $fline) {

      $line_index++;

      if(strpos($fline, $search) !== false)
      {
         $found_lines++;

         echo $original_lines[$line_index];
      }

      if ($found_lines == $num_matches){
         break; // No more matches, so stop processing additional lines
      }
   }
}
else{
   echo "No matches...";
}
Joe Ward
  • 181
  • 4