您的位置:首页 > 编程语言 > PHP开发

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

2016-04-22 11:52 507 查看
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 分两次替换关键词语

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

如上,解决
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: