PHP根据关键字把内容处理成数组,关键字高亮

一、前言

  • 比如有一段话:你好,我好,大家好
  • 关键字是:
  • 然后结果数据就是:(high 是否高亮:1-是;0-否)
array (
      0 => 
      array (
        'content' => '你',
        'high' => 0,
      ),
      1 => 
      array (
        'content' => '好',
        'high' => 1,
      ),
      2 => 
      array (
        'content' => ',',
        'high' => 0,
      ),
      3 => 
      array (
        'content' => '我',
        'high' => 1,
      ),
      4 => 
      array (
        'content' => '好',
        'high' => 1,
      ),
      5 => 
      array (
        'content' => ',大家',
        'high' => 0,
      ),
      6 => 
      array (
        'content' => '好',
        'high' => 1,
      ),
    ),

二、代码

    public function start()
    {
    
    
        $keywords = ["你好", "啊", "亮晶晶", "梳妆匣", "说道", "一层楼", "之"];
        $list = [
            ['name' => "内容第一行", 'content' => "你好艾希你你好啊,你好好啊,你真的明明好啊,眼睛亮晶晶的,nihao"],
            ['name' => "内容第二行", 'content' => "Hello,请别走走停停,休息一下说道说道,漂亮的梳妆匣梳妆匣梳妆匣送给你,如沐春风如沐春风"],
            ['name' => "内容第三行", 'content' => "欲穷千里目,更上一层楼"],
            ['name' => "内容第四行", 'content' => "合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下"],
            ['name' => "内容第四行", 'content' => "内容"],
        ];

        foreach ($list as &$value) {
    
    
            $value['content_arr'] = $this->findKeywords($keywords, $value); //结果数据存到content_arr中
        }
        
        var_export($list);
    }

    //php根据关键字把内容处理成数组,关键字高亮
    public function findKeywords($keywords, $value)
    {
    
    
        $temp = []; //关键字内容记录
        $content = $value['content'];
        $contentLen = mb_strlen($content); //内容的长度

        foreach ($keywords as $key) {
    
    
            $keyLen = mb_strlen($key); //关键字的长度
//                $contentLen = mb_strlen($content); //内容的长度
            $count = mb_substr_count($content, $key); //统计字符出现的次数

            $startSearchIndex = 0; //开始搜索的位置,重置
            for ($i = 0; $i < $count; $i++ ) {
    
     //记录关键字出现的位置
                $index = mb_stripos($content, $key, $startSearchIndex); //用来查找字符串中某部分字符串首次出现的位置(不区分大小写)。

                $temp[] = [
                    'key' => $key, //关键字内容
                    'index' => $index, //关键字索引位置
                    'len' => $keyLen, //关键字长度
                ];

                $startSearchIndex = ($index + $keyLen); //重置开始搜索的位置

                //关键字被提取,重置content内容
                /*if ($index == 0) { //第一个就是,出现在句子开头,直接截取后面的即可
                    $content = mb_substr($content, $keyLen);
                } else if (($index + $keyLen) == $contentLen) { //出现在句子结尾,直接截取前面内容
                    $content = mb_substr($content, 0, $index);
                } else { //出现在中间,左右两边都要截取
                    $content = mb_substr($content, 0, $keyLen) . mb_substr($content, ($keyLen + $index));
                }*/
            }
        }

        $tempResult = []; //最终结果数据(包括没高亮的数据)

        //二维数组根据关键字的索引index升序
        $sort = array_column($temp, 'index');
        array_multisort($sort, SORT_ASC, $temp);

        if ($temp) {
    
     //关键字存在,做数据截取操作
            $lastIndex = 0; //下一个需要匹配的数据
            $tempCount = count($temp); //关键字的长度
            foreach ($temp as $k => $v) {
    
    
                $key = $v['key'];
                $index = $v['index'];
                $len = $v['len'];

                if ($index != $lastIndex) {
    
     //关键字不是在内容最前面,
                    $tempResult[] = [
                        'content' => mb_substr($content, $lastIndex, ($index - $lastIndex)), //追加内容开头数据
                        'high' => 0 //是否高亮:1-是;0-否
                    ];
                }

                $tempResult[] = [
                    'content' => $key,
                    'high' => 1 //是否高亮:1-是;0-否
                ];

                $lastIndex = ($index + $len);

                //如果是最后一个:判断一下,如果:最后一个关键字不是在结尾,需要拼接一下结尾数据
                if ((($k + 1) == $tempCount) && ($lastIndex != $contentLen)) {
    
    
                    $tempResult[] = [
                        'content' => mb_substr($content, $lastIndex), //追加内容开头数据
                        'high' => 0 //是否高亮:1-是;0-否
                    ];
                }
            }

        } else {
    
     //关键字不存在,直接赋值
            $tempResult[] = [
                'content' => $content,
                'high' => 0 //是否高亮:1-是;0-否
            ];
        }

        return $tempResult; //返回结果数据
    }

三、打印

array (
  0 => 
  array (
    'name' => '内容第一行',
    'content' => '你好艾希你你好啊,你好好啊,你真的明明好啊,眼睛亮晶晶的,nihao',
    'content_arr' => 
    array (
      0 => 
      array (
        'content' => '你好',
        'high' => 1,
      ),
      1 => 
      array (
        'content' => '艾希你',
        'high' => 0,
      ),
      2 => 
      array (
        'content' => '你好',
        'high' => 1,
      ),
      3 => 
      array (
        'content' => '啊',
        'high' => 1,
      ),
      4 => 
      array (
        'content' => ',',
        'high' => 0,
      ),
      5 => 
      array (
        'content' => '你好',
        'high' => 1,
      ),
      6 => 
      array (
        'content' => '好',
        'high' => 0,
      ),
      7 => 
      array (
        'content' => '啊',
        'high' => 1,
      ),
      8 => 
      array (
        'content' => ',你真的明明好',
        'high' => 0,
      ),
      9 => 
      array (
        'content' => '啊',
        'high' => 1,
      ),
      10 => 
      array (
        'content' => ',眼睛',
        'high' => 0,
      ),
      11 => 
      array (
        'content' => '亮晶晶',
        'high' => 1,
      ),
      12 => 
      array (
        'content' => '的,nihao',
        'high' => 0,
      ),
    ),
  ),
  1 => 
  array (
    'name' => '内容第二行',
    'content' => 'Hello,请别走走停停,休息一下说道说道,漂亮的梳妆匣梳妆匣梳妆匣送给你,如沐春风如沐春风',
    'content_arr' => 
    array (
      0 => 
      array (
        'content' => 'Hello,请别走走停停,休息一下',
        'high' => 0,
      ),
      1 => 
      array (
        'content' => '说道',
        'high' => 1,
      ),
      2 => 
      array (
        'content' => '说道',
        'high' => 1,
      ),
      3 => 
      array (
        'content' => ',漂亮的',
        'high' => 0,
      ),
      4 => 
      array (
        'content' => '梳妆匣',
        'high' => 1,
      ),
      5 => 
      array (
        'content' => '梳妆匣',
        'high' => 1,
      ),
      6 => 
      array (
        'content' => '梳妆匣',
        'high' => 1,
      ),
      7 => 
      array (
        'content' => '送给你,如沐春风如沐春风',
        'high' => 0,
      ),
    ),
  ),
  2 => 
  array (
    'name' => '内容第三行',
    'content' => '欲穷千里目,更上一层楼',
    'content_arr' => 
    array (
      0 => 
      array (
        'content' => '欲穷千里目,更上',
        'high' => 0,
      ),
      1 => 
      array (
        'content' => '一层楼',
        'high' => 1,
      ),
    ),
  ),
  3 => 
  array (
    'name' => '内容第四行',
    'content' => '合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下',
    'content_arr' => 
    array (
      0 => 
      array (
        'content' => '合抱',
        'high' => 0,
      ),
      1 => 
      array (
        'content' => '之',
        'high' => 1,
      ),
      2 => 
      array (
        'content' => '木,生于毫末;九层',
        'high' => 0,
      ),
      3 => 
      array (
        'content' => '之',
        'high' => 1,
      ),
      4 => 
      array (
        'content' => '台,起于累土;千里',
        'high' => 0,
      ),
      5 => 
      array (
        'content' => '之',
        'high' => 1,
      ),
      6 => 
      array (
        'content' => '行,始于足下',
        'high' => 0,
      ),
    ),
  ),
  4 => 
  array (
    'name' => '内容第四行',
    'content' => '内容',
    'content_arr' => 
    array (
      0 => 
      array (
        'content' => '内容',
        'high' => 0,
      ),
    ),
  ),
)

四、相关链接

猜你喜欢

转载自blog.csdn.net/qq_36025814/article/details/129453944
今日推荐