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
相关产品推荐
相关产品推荐

