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){
修改方法为_keylinks()
修改代码如下
修改思路如下 :首先对关键词进行排序 ,使用usort函数采用自定义函数排序,关键词长的放前面
其次循环关键词组时增加 foreach($linkdatas as $k=>$v) 增加$k最为正则替换中间变量
最后 增加中间变量 modd1 modd2 分两次替换关键词语
在代码中 理论上只需要排序即可,不需要使用中间变量进行处理,但是为了必变避免内联嵌套,所以使用了中间变量完全避免关键词的相关性
如上,解决
样板地址
修改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 分两次替换关键词语
在代码中 理论上只需要排序即可,不需要使用中间变量进行处理,但是为了必变避免内联嵌套,所以使用了中间变量完全避免关键词的相关性
如上,解决
相关文章推荐
- win7配置简单的FTP服务器
- Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/ 的错误解决方法
- php 多页面间共享变量
- php简单实现sql防注入的方法
- php 处理ftp常用操作与方法
- php 实现购物车
- PHP 文件处理手册
- telnet 使用smtp发送邮件
- PHP 常用函数
- PHP简单获取及判断提交来源的方法
- PHP随记之controller
- SCI/EI/ISTP收录号查询方法
- PHP随记之config(ThinkPHP汇总)
- php中的位运算符
- thinkPHP3.1验证码的简单实现方法
- thinkPHP实现将excel导入到数据库中的方法
- php中isset和array_key_exists测试对比
- php数组快速排序
- 利用php输出不同的心形图案
- php生成酷炫的四个字符验证码