博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DEDE 自动添加锚文本功能(没弄完..)

Posted on 2017-04-19 11:38  ZT无风  阅读(349)  评论(0)    收藏  举报

DEDE 系统后台自动添加锚文本规则是全匹配,有些版本是按关键词标签来匹配的。只要你在文档关键词中添加了的关键词都会在文章中添加,这样有些瑕疵。例如 “苹果” 与 “苹果电脑“ 是包含关系。将会嵌套地添加锚文本。还有就是不能体现锚文本多样化。 下面是添加这两个功能的方法。

 关键词添加:

①            数据库  dede_keywords表中添加字段: item  int(8);

②  后台:/dede/templates/ article_keywords_main.htm  和/dede/article_keywords_main.htm 添加“组ID“的相关选项, 添加 组ID选项。频率为同组中关键词出现的概率。

 

 

选取关键词,自动添加锚文本:

思路:

①           第一次筛选:文章中与文档关键词库匹配的所有关键词。

②            第二次筛选:上次筛选中,再把相同item号的关键词中按它们的概率抽取出其中的一个。

③            文章中与筛选后的关键词匹配的关键词做成锚文本,并在文章中添加“已加锚文本的标签(<!--ANCHOR_ADDED-->)“(防止再生成或修改文章时锚文本变动),写入数据表。

PS:要想重新添加锚文本,在文章编辑中去掉<!--ANCHOR_ADDED-->。

 

 

代码:

涉及文件include/arc.archives.class.php

在文件最后添加概率选取函数如下:

    

/*概率选取

 * @param $proArr =array('a'=>20,'b'=>30,'c'=>50);

 */

function get_rand($proArr) {

    $result = '';

    //概率数组的总概率精度

    $proSum = array_sum($proArr);

    //概率数组循环

    foreach ($proArr as $key => $proCur) {

        $randNum = mt_rand(1, $proSum);             //抽取随机数

        if ($randNum <= $proCur) {

            $result = $key;                         //得出结果

            break;

        } else {

            $proSum -= $proCur;                    

        }

    }

    unset ($proArr);

    return $result;

}

修改函数 ReplaceKeyword($kw,&$body) 如下:

    /**

     * 高亮问题修正, 排除alt title <a></a>直接的字符替换

     *

     * @param string $kw

     * @param string $body

     * @return string

     */

    function ReplaceKeyword($kw,&$body)

    {

           if(stripos($body,'ANCHOR_ADDED'))

           {

                 //文档已添加过锚文本

                 return $body;

           }

        global $cfg_cmspath;

        $maxkey = 5;

        $kws = explode(",",trim($kw));   //以分好为间隔符        

        $i=0;

        $karr = $kaarr = $GLOBALS['replaced'] = array();

          

        //暂时屏蔽超链接

        $body = preg_replace("#(<a(.*))(>)(.*)(<)(\/a>)#isU", '\\1-]-\\4-[-\\6', $body);

 

        $query = "SELECT * FROM #@__keywords WHERE rpurl<>'' AND sta=1 ORDER BY item DESC";

        $this->dsql->SetQuery($query);

        $this->dsql->Execute();

          

           if( $this->dsql->GetTotalRow() > 0 )

           {

                 $keyarr = $keyurlarr = array();

                  while($row = $this->dsql->GetArray())

                 {

                      //提取文中出现的关键词,按组ID分组

                      if(strpos($body, $row['keyword']) !== false)

                      {

                            $keywordarr[$row['item']][trim($row['keyword'])] = $row['rank'];

                            $keyurlarr[trim($row['keyword'])] = $row['rpurl'];

                      }

                 }

                 //关键词进一步概率筛选

                 foreach($keywordarr as $v)

                 {

                      $key = get_rand($v);

                      $key_url = $keyurlarr[$key];

                      $karr[] = $key;

                      $kaarr[] = '<a href="'.$key_url.'" target="_blank"><u>'.$key.'</u></a>';

                 }

                

           }

          

           file_put_contents('d:/debug.txt',var_export($karr,true)."\n\n\n", FILE_APPEND);

           file_put_contents('d:/debug.txt',var_export($kaarr,true)."\n\n\n", FILE_APPEND);

        // 这里可能会有错误

        $body = @preg_replace("#(^|>)([^<]+)(?=<|$)#sUe", "_highlight('\\2', \$karr, \$kaarr, '\\1')", $body);

           //恢复超链接

        $body = preg_replace("#(<a(.*))-\]-(.*)-\[-(\/a>)#isU", '\\1>\\3<\\4', $body);

                

           //添加已锚文本化的标识<!--ANCHOR_ADDED-->

           $body = '<!--ANCHOR_ADDED-->'.$body;

          

           $upquery = "UPDATE `#@__addonarticle` SET body='$body' WHERE aid='$this->ArcID'";

           $this->dsql->ExecuteNoneQuery($upquery);

          

        return $body;

    }

}//End Archives

 

dede版本 5.7 gbk  ,基本可以,没有全面测试。有问题可以探讨。

修改后文件下载: