最近项目上有一个在文章关键词前后插入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>