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

如何改造新闻表搜索函数,返回含高亮搜索文本的截断内容?

实现带高亮搜索文本的截断新闻内容搜索函数

问题描述

需要修改已有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:23:08