PHP поиск и возврат точных совпадений только из файла CSV - PullRequest
1 голос
/ 04 марта 2020

Приведенный ниже код выполняет поиск в моем CSV-файле, но возвращает несколько результатов, когда я только хочу, чтобы он возвращал точное значение. Например; в моем файле CSV у меня есть следующее в отдельных строках: Генри Джонс, Сара Джонс. Если я ищу Сару Джонс, она возвращает оба, основываясь на соответствующей фамилии. Кто-нибудь может помочь? Я пробовал несколько вещей, но без радости! Заранее большое спасибо!

<?php
if ( !isset( $_GET['q'] ) && !isset( $_GET['update'] ) ) {
    echo '<div class="alert">' . $txt_hint . '</div>';
}
// Only on FORM Submit
if ( isset( $_GET['q'] ) && !empty( $_GET['q'] ) ) {
    // Remove the Regex Char
    $words = str_replace( '#', '', $_GET['q'] );
    // Open CSV.File
    $file  = fopen( $CSV_Filename, 'r' );
    // Supports any Number of Search-Words
    $words = explode ( ' ', $words );    
    // Make the Search-Words safe to use in Regex (escapes special characters)
    $words = array_map( 'preg_quote', $words );
    // Make Regex e.g. '/Project|Name/i' means 'Project or Name' case (i)nsensitive
    $regex = '#' . implode( '|', $words ) . '#i';







    // Set Skip-First-Line Helper
    $flag = true;
    // Loop each Line
    while ( ( $line = fgetcsv( $file ) ) !== FALSE ) {
        // Skip first Line (only Healine, no real Data)
        if ( $flag ) {
            $flag = false;
            continue;
        }
        // Split Line
        list( $Details_1,$Time_Started,$Details_3,$Job_Name,$Time_Complete ) = $line;
        // Check if Search-Match AND $Time_Complete is empty
        if ( preg_match( $regex, $Job_Name ) && $Time_Complete == '' ) {
            // Show Data in Browser
            echo '
              <div class="box">' . $Time_Started . '</div>
              <div class="box">' . $Details_3 . '</div>
              <div class="box">' . $Job_Name . '</div>

              <div class="box noBorder"><a class="update" 
               href="' . htmlentities($_SERVER['PHP_SELF']) . '?update=' .
               htmlentities( urlencode( $Job_Name ) ) . '">' . 
               $txt_completebutton . '</a></div><br>
            ';
            // Set Search-Hit Helper
            $hit = true;
        }
    }

1 Ответ

0 голосов
/ 04 марта 2020

Вы можете попробовать что-то подобное с регулярным выражением fullMatch и флагом fullMatch.

Если найдено полное совпадение, срабатывает флаг fullMatch, и тогда в поиске может быть найдено только полное совпадение

// Make Regex e.g. '/Project|Name/i' means 'Project or Name' case (i)nsensitive
$regex = '#' . implode( '|', $words ) . '#i';
$regexFullMatch = '#' . implode( '', $words ) . '#i';
$isFullMatched = true;
.
.
.
if ( preg_match( $regex, $Job_Name ) && $Time_Complete == '' ) {
      if(preg_match( $regexFullMatch, $Job_Name )){
        // Show Data in Browser
        echo '
          <div class="box">' . $Time_Started . '</div>
          <div class="box">' . $Details_3 . '</div>
          <div class="box">' . $Job_Name . '</div>

          <div class="box noBorder"><a class="update" 
           href="' . htmlentities($_SERVER['PHP_SELF']) . '?update=' .
           htmlentities( urlencode( $Job_Name ) ) . '">' . 
           $txt_completebutton . '</a></div><br>
        ';
        // Set Search-Hit Helper
        $hit = true;
        $isFullMatched = true;
    }
    else if(!$isFullMatched){
        // Show Data in Browser
        echo '
          <div class="box">' . $Time_Started . '</div>
          <div class="box">' . $Details_3 . '</div>
          <div class="box">' . $Job_Name . '</div>

          <div class="box noBorder"><a class="update" 
           href="' . htmlentities($_SERVER['PHP_SELF']) . '?update=' .
           htmlentities( urlencode( $Job_Name ) ) . '">' . 
           $txt_completebutton . '</a></div><br>
        ';
        // Set Search-Hit Helper
        $hit = true;
    }
}

Примечание: этот код не оптимизирован, но дает представление!

...