如何改造新闻表搜索函数,返回含高亮搜索文本的截断内容?
实现带高亮搜索文本的截断新闻内容搜索函数
问题描述
需要修改已有的get_search_text函数,使其不再返回完整新闻内容,而是返回仅包含首次搜索文本出现位置的截断内容,并高亮匹配的文本。原函数代码如下:
function get_search_text($model,$search_text){ if (preg_match("/{$search_text}/i", $model->content)) { return preg_replace("/\w*?$search_text\w*/i", "<span style=\"background-color:yellow\" >$0</span>", $model->content); } }
修改后的实现方案
通过定位首次匹配位置、截取前后指定长度内容、高亮匹配文本并添加截断标识的方式实现需求,修改后的函数代码如下:
function get_search_text($model, $search_text) { $content = $model->content; // 不区分大小写定位首次匹配的位置 $matchPos = stripos($content, $search_text); if ($matchPos === false) { return ''; // 无匹配时返回空或自定义默认内容 } $highlightLen = strlen($search_text); // 定义匹配位置前后保留的字符数,可按需调整 $preKeepLen = 100; $postKeepLen = 100; // 计算截取起始位置,防止出现负数索引 $startPos = max(0, $matchPos - $preKeepLen); // 计算截取结束位置,不超过内容总长度 $endPos = min(strlen($content), $matchPos + $highlightLen + $postKeepLen); // 截取目标内容段 $truncatedContent = substr($content, $startPos, $endPos - $startPos); // 添加省略号标识截断状态 if ($startPos > 0) { $truncatedContent = '...' . $truncatedContent; } if ($endPos < strlen($content)) { $truncatedContent .= '...'; } // 对截取内容中的搜索文本进行高亮处理 $highlightedContent = preg_replace("/{$search_text}/i", "<span style=\"background-color:yellow\">$0</span>", $truncatedContent); return $highlightedContent; }
代码说明
- 用
stripos快速定位首次匹配位置,比正则匹配更高效 - 通过
$preKeepLen和$postKeepLen控制截断内容的长度,可根据页面布局需求调整数值 - 处理截取边界,避免出现索引越界问题
- 给非开头/结尾的截断内容添加省略号,明确提示用户内容被截断
- 最后对截取段内的搜索文本做高亮替换,保证视觉突出
内容的提问来源于stack exchange,提问作者JKSDS
相关产品推荐
相关产品推荐

