【问题标题】:Highlight multiple keywords advanced突出显示多个关键字高级
【发布时间】:2016-05-30 13:55:34
【问题描述】:

我尝试了这里回答的大部分解决方案,但他们都有同样的问题,这是我的问题。

我使用这个功能来突出搜索结果:

function highlightWords($searchtext, $searchstrings){   
        $searchstrings = preg_replace('/\s+/', ' ', trim($searchstrings));
        $words = explode(' ', $searchstrings);

        $highlighted = array();
        foreach ( $words as $word ){
            $highlighted[] = "<font color='#00f'><b>".$word."</b></font>";
        }

        return str_replace($words, $highlighted, $searchtext);
    }

当我搜索包含 2 个或多个用空格分隔的字符串的文本并且其中任何一个具有我突出显示的数组中的任何 HTML 代码时,就会出现问题。

例如,searchtext="I have max system performance" AND searchstrings="max f"

在第一次迭代中,foreach 会将每个 ma​​x 替换为 &lt;font color='#00f'&gt;&lt;b&gt;max&lt;/b&gt;&lt;/font&gt;

在第二次迭代中,它会将每个 f 替换为 &lt;font color='#00f'&gt;&lt;b&gt;f&lt;/b&gt;&lt;/font&gt;

第二次迭代也将替换第一次替换中插入的 html 标签! 所以它也会替换字符串&lt;font color='#00f'&gt;中的f

有什么建议吗? 谢谢 调剂

【问题讨论】:

    标签: php html arrays highlight keyword


    【解决方案1】:

    试试下面的

    foreach ( $words as $word ){
       if(strlen ($word)>2)
       {
          $highlighted[] = "<font color='#00f'><b>".$word."</b></font>";
       }
    }
    

    【讨论】:

      【解决方案2】:

      也许这对您来说是个不错的解决方案?

       function highlightWords($searchtext, $searchstrings){   
              $searchstrings = preg_replace('/\s+/', ' ', trim($searchstrings));
              $words = explode(' ', $searchstrings);
      
              $highlighted = array();
              foreach ( $words as $word ){
                  $highlighted[] = '<span class="highlighted-word">'.$word.'</span>';
              }
      
              return str_replace($words, $highlighted, $searchtext);
          }
      
      echo highlightWords('I have max system performance', 'max f');
      
      
      ?>
      

      您需要在页面上添加一点 CSS:

      <style>
      .highlighted-word {
          font-weight: bold;
      }
      </style>
      

      输出: 我有 ma​​x 系统 performance

      ---

      更新: 如果您想突出显示完整的单词,请查看:

      function highlightCompleteWords($searchtext, $searchstrings){   
              $searchstrings = preg_replace('/\s+/', ' ', trim($searchstrings));
              $words = explode(' ', $searchstrings);
      
      
              $highlighted = array();
              foreach ( $words as $word ){
                  $searchtext = preg_replace("/\w*?".preg_quote($word)."\w*/i", "<span class='highlighted-word'>$0</span>", $searchtext);
              }
      
              return $searchtext;
          }
      
      
      echo highlightCompleteWords('I have max system performance', 'max f');
      

      输出:我有 ma​​x 系统 performance

      【讨论】:

      • 感谢您的回答,但如果我搜索例如“some las”,在第一个循环中它会在第二个循环中将“some”更改为“
      【解决方案3】:

      我可能不完全理解您的问题,但我猜您想突出显示搜索字符串中的每个匹配词。

      你可能只是做这样的事情:

       $returnString = $searchtext;
          foreach ( $words as $word ){
             $returnString = preg_replace('/\b'.$word.'\b/i', "<font color='#00f'><b>$0</b></font>", $returnString);
          }
       return $returnString;
      

      这将输出:“我有 ma​​x 系统性能”

      因为 "f" 不会被匹配

      EDIT - 如果你也想匹配单词的一部分。

      有点丑,但我相信这会为你分叉

      $returnString = $searchtext;
          foreach ( $words as $word ){
             if(strlen($word)>2){
                $returnString = preg_replace('/'.$word.'/i', "§§§$0###", $returnString);
             }
          }
      $returnString = preg_replace("/\§§§/","<font color='#00f'><b>", $returnString);
      $returnString = preg_replace("/\###/","</b></font>", $returnString);
      
      return $returnString;
      

      【讨论】:

      • 为什么 'f' 不匹配?在第一个 foreach 循环中替换了 'performance' 和 '
      • 您希望它得到匹配吗?以为您只想突出匹配的单词,而不是字符?
      • 是的,我希望找到任何搜索过的字符串(除了一个小于 3 字符的字符串)
      • @MiTja 这是一个解决方案吗?
      【解决方案4】:
      <?php
          $searchtext = "I have max system performance";
          $searchstrings = "max f";
          $searchstrings = preg_replace('/\s+/', ' ', trim($searchstrings));
          $words = explode(' ', $searchstrings);
          $highlighted = array();
          foreach ( $words as $word ){
              $highlighted[] = "<font color='#00f'><b>".$word."</b></font>";
          }
          echo strtr($searchtext, array_combine($words, $highlighted));
      ?>
      

      【讨论】:

      • 这是同样的情况。第二个字符串的 Foreach 循环也将替换第一个循环中插入的 html 代码!
      • 这看起来很聪明,但没有突出显示...仍在调试
      • 不是 1 个字符,如果第二个字符串(通过搜索找到)有任何作为突出显示代码插入的内容,它也会被替换(刚刚尝试搜索“max nt”,“nt " 在 中被替换。在您更新的代码中,str_replace 没有做任何事情:-(
      • 嗯,我不能让它工作。我收到错误:警告:preg_replace():分隔符不能是字母数字。我对 reg exp 不太熟悉 :-(
      • 我已经编辑了上面的代码。它的工作。你只需要添加你的函数,而不是回显它,它会为你工作
      猜你喜欢
      • 2017-10-04
      • 2010-10-31
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2017-10-18
      • 2012-02-10
      • 1970-01-01
      相关资源
      最近更新 更多