You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel10搜索关键词黄色高亮失效,请求排查原因

Laravel 10 搜索关键词高亮失效问题排查与修复

核心问题分析

导致高亮功能失效的关键错误有以下几点:

  • 变量传递错误:Controller中查询结果存储在$results,但传递给视图的是未定义的$posts,视图循环的是错误数据;同时错误传递了单个$result变量,完全无意义。
  • HTML转义问题:Blade中使用{{ }}输出内容会自动转义HTML,高亮的<span>标签被转为纯文本,无法渲染样式。
  • 模板语法错误:Blade代码里的<td>{{ $result }}</td缺少闭合符号>,属于语法错误。

修复后的代码

Controller 修复版

public function index(Request $request)
{
    $q = Post::query();     

    if(isset($request->keyword) && $request->keyword_type === "or"){
        $keywords = explode(",", $request->keyword);
        $q->where(function ($query) use($keywords) {
            foreach($keywords as $keyword){
                $query->orWhere('title', 'LIKE',"%$keyword%");
            }
        });
    } elseif(isset($request->keyword)) {
        $keywords = explode(",", $request->keyword);
        foreach($keywords as $keyword){
            $q->where('title', 'LIKE',"%$keyword%");
        }
    }

    $results = $q->get();
    $results->count = $results->count(); // 直接用集合原生count方法更高效

    // 高亮处理
    if(isset($request->keyword)) {
        $keywords = explode(",", $request->keyword);
        foreach($results as $result){
            $result->title = $this->search_text_highlight($keywords, $result->title);
        }
    }

    return view('posts.index')
        ->with([
            'posts' => $results, // 传递正确的查询结果变量
            'count_result' => $results->count()
        ])->with('i', (request()->input('page', 1) - 1) * 5);
}

/**
 * 搜索关键词高亮函数
 *
 * @param array $keywords 
 * @param string $target_string 
 * @return string
 */
public function search_text_highlight($keywords, $target_string)
{
    if(empty($keywords)){
        return $target_string;
    }

    foreach($keywords as $keyword){
        $keyword = trim($keyword); // 去除关键词前后空格,避免无效匹配
        if( ($pos = mb_strpos($target_string, $keyword, 0, 'UTF-8')) !== false ){
            $str = mb_substr($target_string, $pos, mb_strlen($keyword, 'UTF-8'), 'UTF-8');
            $target_string = str_replace($str, "<span style='background-color:yellow'>{$str}</span>", $target_string);
        }
    }
    return $target_string;
}

Blade 修复版

@foreach ($posts as $post)
<tr>                            
    <td>{!! $post->title !!}</td> <!-- 使用{!! !!}避免HTML转义,让高亮标签生效 -->
</tr>    
@endforeach

额外优化建议

  • 高亮函数可改用正则替换,支持不区分大小写匹配(需对关键词做正则转义):
    foreach($keywords as $keyword){
        $keyword = trim($keyword);
        $escapedKeyword = preg_quote($keyword, '/');
        $target_string = preg_replace("/($escapedKeyword)/i", "<span style='background-color:yellow'>$1</span>", $target_string);
    }
    
  • 提前处理关键词,避免在循环中重复执行explode(",", $request->keyword),提升性能。

内容的提问来源于stack exchange,提问作者blusonic23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:45:24