phpcms V9 内联/关联链接 字符串较长链接无法正确替换的问题完美解决

来源:互联网 发布:如何看待马蓉 知乎 编辑:程序博客网 时间:2024/05/01 21:43

http://www.taisha.org/index.php?m=content&siteid=1&a=show&catid=27&id=45104

样板地址 

修改phpcms扩展函数文件库,/phpcms/libs/functions/extention.func.php新增函数cmp

function cmp($a,$b){

            if(is_array($a)||is_array($b)){                if ($a[0] == $b[0]){return 0;}else{return ((strlen($a[0]))<(strlen($b[0]))) ? 1 : -1;}              }else{            if ($a == $b){return 0;}else{return ((strlen($a))<(strlen($b))) ? 1 : -1;}            }}
修改文件为/phpcms/modules/content/fields/editor/output.inc.php

修改方法为_keylinks()

修改代码如下

function _keylinks($txt, $replacenum = '',$link_mode = 1) {$search = "/(alt\s*=\s*|title\s*=\s*)[\"|\'](.+?)[\"|\']/is";$txt = preg_replace_callback($search, array($this, '_base64_encode'), $txt);$keywords = $this->data['keywords'];if($keywords) $keywords = strpos(',',$keywords) === false ? explode(' ',$keywords) : explode(',',$keywords);if($link_mode && !empty($keywords)) {foreach($keywords as $keyword) {$linkdatas[] = $keyword;}} else {$linkdatas = getcache('keylink','commons');}if($linkdatas) {usort($linkdatas , "cmp");$word = $replacement = array();foreach($linkdatas as $k=>$v) {if($link_mode && $keywords) {$word1[] = '/(?!(<a.*?))' . preg_quote($v, '/') . '(?!.*<\/a>)/s';$word2[] = $v;$midd1[] = "@$k@";                    $midd2[] = "/@$k@/";$replacement[] = '<a href="javascript:;" onclick="show_ajax(this)" class="keylink">'.$v.'</a>';} else {$word1[] = '/(?!(<a.*?))' . preg_quote($v[0], '/') . '(?!.*<\/a>)/s';$word2[] = $v[0];$midd1[] = "@$k@";                    $midd2[] = "@$k@";$replacement[] = '<a href="'.$v[1].'" target="_blank" class="keylink">'.$v[0].'</a>';}}if($replacenum != '') {                $txt = preg_replace($word1, $midd1, $txt, $replacenum);$txt = preg_replace($midd2, $replacement, $txt, $replacenum);} else {                $txt = str_replace($word2, $midd1, $txt);$txt = str_replace($midd2, $replacement, $txt);}}$txt = preg_replace_callback($search, array($this, '_base64_decode'), $txt);return $txt;}


修改思路如下 :首先对关键词进行排序 ,使用usort函数采用自定义函数排序,关键词长的放前面

其次循环关键词组时增加 foreach($linkdatas as $k=>$v) 增加$k最为正则替换中间变量

最后 增加中间变量 modd1 modd2 分两次替换关键词语


在代码中 理论上只需要排序即可,不需要使用中间变量进行处理,但是为了必变避免内联嵌套,所以使用了中间变量完全避免关键词的相关性


如上,解决



0 0
原创粉丝点击