Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP搜索并仅从csv文件返回精确匹配_Php_Regex_Preg Match - Fatal编程技术网

PHP搜索并仅从csv文件返回精确匹配

PHP搜索并仅从csv文件返回精确匹配,php,regex,preg-match,Php,Regex,Preg Match,下面的代码搜索我的csv文件,但返回多个结果时,我只希望它返回准确的。例如在我的csv文件中,我有以下几行:亨利·琼斯,莎拉·琼斯。 如果我搜索Sarah Jones,它会根据匹配的姓氏返回两个。 有人能帮忙吗?我尝试了很多东西,但没有乐趣!提前非常感谢 <?php if ( !isset( $_GET['q'] ) && !isset( $_GET['update'] ) ) { echo '<div class="alert">' . $txt_hi

下面的代码搜索我的csv文件,但返回多个结果时,我只希望它返回准确的。例如在我的csv文件中,我有以下几行:亨利·琼斯,莎拉·琼斯。 如果我搜索Sarah Jones,它会根据匹配的姓氏返回两个。 有人能帮忙吗?我尝试了很多东西,但没有乐趣!提前非常感谢

<?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;
        }
    }

您可以使用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;
    }
}
//使Regex例如“/Project | Name/i”表示“Project或Name”case(i)不敏感
$regex='#'。内爆(“|”,$words)。”#我;
$regexFullMatch='#'。内爆(“”,$words)。'#我;
$isFullMatched=true;
.
.
.
if(preg_match($regex,$Job_Name)&$Time_Complete==“”){
if(preg_match($regexFullMatch,$Job_Name)){
//在浏览器中显示数据
回声'
“.$Time_开始。”
“.$Details_3”
“.$Job_Name”

'; //设置搜索命中帮助器 $hit=true; $isFullMatched=true; } 如果(!$isFullMatched),则为else{ //在浏览器中显示数据 回声' “.$Time_开始。” “.$Details_3” “.$Job_Name”
'; //设置搜索命中帮助器 $hit=true; } }

注意:这段代码没有经过优化,但它给了你一个想法

您可以使用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;
    }
}
//使Regex例如“/Project | Name/i”表示“Project或Name”case(i)不敏感
$regex='#'。内爆(“|”,$words)。”#我;
$regexFullMatch='#'。内爆(“”,$words)。'#我;
$isFullMatched=true;
.
.
.
if(preg_match($regex,$Job_Name)&$Time_Complete==“”){
if(preg_match($regexFullMatch,$Job_Name)){
//在浏览器中显示数据
回声'
“.$Time_开始。”
“.$Details_3”
“.$Job_Name”

'; //设置搜索命中帮助器 $hit=true; $isFullMatched=true; } 如果(!$isFullMatched),则为else{ //在浏览器中显示数据 回声' “.$Time_开始。” “.$Details_3” “.$Job_Name”
'; //设置搜索命中帮助器 $hit=true; } }

注意:这段代码没有经过优化,但它给了你一个想法

您特别创建了一个正则表达式,它使用
|
将所有单独的术语列为替代项。如果你不想这样…那你为什么要这样做?如果你只想找到精确的匹配(?)-用搜索词
Sarah Jones
,只找到在目标列中有精确的
Sarah Jones
的记录,没有更多,也没有更少-那么首先为什么要使用正则表达式呢?正如CBroe提到的,您不需要正则表达式,请尝试strps()。非常感谢您的评论。我删除了“|”,它阻止返回两个名称,但也不会返回名称“Sarah Jones”?我不是php专家,所以非常感谢任何指导!分类!我离得太近了,真不敢相信我要做的事情有多少!!再次感谢。KevYou特别创建了一个正则表达式,它使用
|
将所有单个术语列为替代项。如果你不想这样…那你为什么要这样做?如果你只想找到精确的匹配(?)-用搜索词
Sarah Jones
,只找到在目标列中有精确的
Sarah Jones
的记录,没有更多,也没有更少-那么首先为什么要使用正则表达式呢?正如CBroe提到的,您不需要正则表达式,请尝试strps()。非常感谢您的评论。我删除了“|”,它阻止返回两个名称,但也不会返回名称“Sarah Jones”?我不是php专家,所以非常感谢任何指导!分类!我离得太近了,真不敢相信我要做的事情有多少!!再次感谢。KevHi Lucas,这真的很有帮助,非常感谢!!我添加了regexFullMatch,它阻止了全名返回命中率,但遗憾的是目前它没有返回全名命中率。看起来名字之间的空格可能会引起问题?再次感谢你让我进入下一步!!!我很高兴这个答案对你有帮助,如果问题解决了,别忘了接受答案!嗨,卢卡斯,这真的很有帮助,非常感谢!!我添加了regexFullMatch,它阻止了全名返回命中率,但遗憾的是目前它没有返回全名命中率。看起来名字之间的空格可能会引起问题?再次感谢你让我进入下一步!!!我很高兴这个答案对你有帮助,如果问题解决了,别忘了接受答案!