文章关键词前后插入指定字符串

最近项目上有一个在文章关键词前后插入html标签的需求,我用php写了一下。

<!DOCTYPE html>
<html>
<head>
    <title>php</title>
</head>
<body>

<?php
   function asiccToUtfArrar($Str) {
        $array = [];
        $length = mb_strlen($Str , 'utf-8');
        for($i=0; $i<$length; $i++) {
            $array[] = mb_substr($Str, $i , 1 , 'utf-8');
        }
        return $array;
   }
   function makeNext($Pstring)
   {
        $m = count($Pstring);
        $next = [];
        $next[0] = 0;
        for ($q=1 , $k =0; $q < $m ; $q++) { 
            while ($k > 0 && $Pstring[$q] != $Pstring[$k]) {
                $k = $next[$k-1];
            }

            if ($Pstring[$q] == $Pstring[$k]) {
                $k += 1;
            }
            $next[$q] = $k;
        }
     return $next;
   }
   function kmp($Tstr , $key)
   {
        $Tstring = $Tstr;
        //var_dump($key->keyWord);
        $Pstring = asiccToUtfArrar($key->keyWord);

        $lenT = count($Tstring);
        $lenM = count($Pstring);

        $next = makeNext($Pstring);
        $totalNumber = 0;
        for ($i=0 , $k=0; $i < $lenT; $i++) { 
            while ($k > 0 && $Pstring[$k] != $Tstring[$i]) {
                $k = $next[$k-1];
            }
            if ($Pstring[$k] == $Tstring[$i]) {
                $k += 1;
            } 
            if ($k == $lenM) {
                $Tstring[$i-$lenM+1] = $key->preIndexOfKeyWord . $Tstring[$i-$lenM+1];
                $Tstring[$i] =  $Tstring[$i] . $key->lateIndexOfkeyWord;
                $k = 0;

                $totalNumber += 1;
                if ($totalNumber >= $key->numberOfinsert) {
                    break;
                }
            }
        }
        //var_dump($Tstring);
        return $Tstring;
   }
   /**
   * 替换关键词
   */
   class wordOfReplace_class
   {

        function __construct($kw , $pw , $lw , $num)
        {
            $this->keyWord = $kw;
            $this->preIndexOfKeyWord = $pw;
            $this->lateIndexOfkeyWord = $lw;
            $this->numberOfinsert = $num;
        }
        public $keyWord; //需要替换的关键词
        public $preIndexOfKeyWord; //关键词前面要插入的字符串
        public $lateIndexOfkeyWord; //关键词后面要插入的字符串
        public $numberOfinsert; //该关键词插入的次数
   }

   function TestKeyReplacement($Test , $KeyOfReplaceArrar) {
        $Test_Str = asiccToUtfArrar($Test);
        foreach ($KeyOfReplaceArrar as $value) {
            $Test_Str = kmp($Test_Str , $value);
        }

      return $Test_Str;
   }

   $arr = array(new wordOfReplace_class("你" , "<p style=\"color:red\">" , "</p>",1) , 
                new wordOfReplace_class("连" , "<p style=\"color:green\">" , "</p>", 1) ,
                new wordOfReplace_class("哈" , "<p style=\"color:green\">" , "</p>", 2) ,
                new wordOfReplace_class("测试文本" , "<p style=\"color:red\">" , "</p>", 2) ,);

   $result = TestKeyReplacement("你好啊,连<br>你好啊,哈哈哈。测试文本测试文本测试文本测试文本" , $arr);

   for ($i=0; $i < count($result); $i++) { 
        printf("%s" , $result[$i]);
      }
?>
</body>
</html>

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值